Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 2317 • Страница 87 из 116<  1 ... 84  85  86  87  88  89  90 ... 116  >
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Member
Статус: Не в сети
Регистрация: 16.04.2006
Откуда: d3d9.dll
Фото: 7
Daemon писал(а):
Почему ASCII символ 8 байт? ПОЧЕМУ?

Да нет. Один символ - один байт. Но этих символов у меня получается аж 8 штук (11001000 - три единицы и пять нулей). Понимаю, что я глупость сделал, ну вот и хотелось бы всё сделать по-человечески. А то у меня посылка из 15-ти байт получилась аж на все 120 байт :haha: (15 байт х 8 бит = 120 бит, где каждый бит - есть символ). А микроконтроллер, "сидящий" по другую сторону СОМ-порта, ждёт от меня посылки в 15 байт, в которой должны содержаться все необходимые ему данные. Прогу для микроконтроллера пишет другой человек.
_SGK спасибо, но это немного не то, что мне нужно. Пойду веселить народ своей проблемой на спец форумах.



Партнер
 

Advanced member
Статус: Не в сети
Регистрация: 09.03.2004
Откуда: Кишинёв
Shader 3.0 писал(а):
_SGK спасибо, но это немного не то, что мне нужно

Это то, но требует немного дополнительных телодвижений. Видимо для вас они сложные :) .
Я вижу такую функцию:
Код:
function bin2byte( str : string ) : byte;
var
    len,i: integer;
begin
    len := length(str);
    bin2byte := 0
    if ( len <= 8 ) then
    begin
        i := len;
        while ( i > 0 ) do
            begin
                bin2byte := bin2byte + (Ord(str[i]) - 48) shl (len - i);
                dec(i)
            end
    end
end;

эх, как бы она на си красиво выглядела.... Передаём строчку и получаем ровно один байт.
_SGK а если бы нужно было 4-рёх байтный integer получить? :) .


 

Member
Статус: Не в сети
Регистрация: 05.01.2005
Shader 3.0
Shader 3.0 писал(а):
_SGK спасибо, но это немного не то, что мне нужно. Пойду веселить народ своей проблемой на спец форумах.

Ну да, согласен :) - бухаем, резвимся, веселим народ... :lol:
Но 1 символ, если он не в Unicode занимает всего 1 байт.
И ты просто можешь передать его как байт. Можешь преобразовать к двоичному представлению – это ничего не меняет.
Надо еще функция, преобразующая байт? На :) -
Код:
function GetData(const Value: Byte): String;
var
  i: Integer;
begin
  Result:= '';
  for i:= 0 to 7 do
  begin
    if Value and (1 shl (i)) <> 0 then
      Result:= Result + '1'
    else
      Result:= Result + '0';
  end;
end;

Байт занимает 8 бит и может содержать значения от 0 до 255. Если Ты в него пытаешься всунуть значение типа Integer, занимающее 32 бита, то это равносильно тому, что в латок для 10-ти яиц ты пытаешься уложить 40. :)
Добавлено спустя 26 минут, 21 секунду
mein
mein писал(а):
Это то, но требует немного дополнительных телодвижений. Видимо для вас они сложные .

Признаюсь честно – да :D сейчас для меня очень многое сложно. :) :lol:
Добавлено спустя 13 минут, 53 секунды
mein
И ваще! :) От уж не ждал от Вас... :mad2: Это типа эа бат-файлы расплата? ;) :lol:
Вот ща хлопну ишо 50 грамм, глядишь еще какое виденье откроется. :lol: Так и будете наезжать? ;) :haha:


 

Member
Статус: Не в сети
Регистрация: 16.04.2006
Откуда: d3d9.dll
Фото: 7
Ещё раз всем низкий поклон за столь бурное обсуждение моей проблемы. Но наверно я неправильно растолковал суть проблемы и сам ввёл участников конференции в заблуждение.
Но я кажется придумал как решить проблему. В общем, я решил что данные в СОМ-порт буду передавать всё-таки ввиде символов. Один байт (число в интервале 0-255) я буду передавать ввиде символа, код которого равен тому числу, которое я хочу передать. :) Допутсим мне нужно передать число 200. А я передам в порт символ "И". Таким образом в передающий буфер СОМ-порта поступит двоичное число, кодирующее этот символ, т. е. 11001000 (число 200 в двоичном виде). Как вам такая идея? Или опять чушь написал?
Добавлено спустя 47 секунд
З. Ы. Что-то ветка сегодня отжигает.


 

Member
Статус: Не в сети
Регистрация: 11.11.2004
Откуда: Челябинск
жжОшь :)
в ком-порт при передаче передаются байты из буфера, а никакие не символы "И", пишешь в буфер число 200 и его передаёшь.

_________________
пишу я программу... и вдруг на клавиатуру выползает bug, буквально


 

Member
Статус: Не в сети
Регистрация: 16.04.2006
Откуда: d3d9.dll
Фото: 7
Rius
Можешь написать как именно это сделать. До конца дней своих буду тебе благодарен. :)


 

Member
Статус: Не в сети
Регистрация: 11.11.2004
Откуда: Челябинск
только на С++, но WinAPI оно и в дельфях WinAPI ;)
Код:
//передача в порт
unsigned char buffer[200];
buffer[0] = 200;
unsigned long written = 0;
WriteFile(FHandle, &buffer, 1, &written, NULL);

_________________
пишу я программу... и вдруг на клавиатуру выползает bug, буквально


 

Member
Статус: Не в сети
Регистрация: 23.12.2004
Откуда: Беларусь, Минск
Народ, а кто что скажет о Delphi 10 lite v3.0? Читал, что вырезан дотнет полностью, а удобство оставлено как у 2006. Работать предполагаю в основном над редкими и простыми лабами в универе и с GLScene.
И что на счёт лицензии - где-то видел, что компиллер делфей свободным стал - разъясните пожалуйста

_________________
ASUS A4M88T-M, Athlon II X3 425, 2GB NCP, video - internal ATI 4250, 200GB Samsung HDD, Win7 x64


 

Junior
Статус: Не в сети
Регистрация: 06.04.2006
Объясните пожалуйста в чем ошибка
тип задан так:
Код:
TMatrix = array of array of integer;

Описание пользовательской функции:
Код:
function FMinY(const A: TMatrix):integer;

Часть кода содержащая ошибку:
Код:
x:=Length(A);//здесь все хорошо
y:=Length(A[Length(A)]);//а в этой строке ошибка

Ведь А это динамический двумерный массив, следовательно можно обратиться к любой его строке, где строка тоже представляет собой одномерный массив.

    Как можно узнать в процедуре размерность двумерного динамического массива(количество строк и столбцов), если явно не передать в функцию/процедуру количество строк и стобцов?


 

Member
Статус: Не в сети
Регистрация: 16.04.2006
Откуда: d3d9.dll
Фото: 7
Rius спасибо тебе большое друг, но у меня в понимании реализации данного проекта в Делфи большие проблемы, а уж в интерпретации С++ мне не эту простую истину не уяснить ещё многие годы (т. к. с С++ вообще никогда не имел дела). Пойду со своей проблемой спрашивать в Королевстве, там вроде много программистов, работавших на Делфи с СОМ-портами. Авось что-нибудь да подскажут.


 

Member
Статус: Не в сети
Регистрация: 11.11.2004
Откуда: Челябинск
пример этой функции есть в этой же теме: http://forums.overclockers.ru/viewtopic.php?p=3760415#3760415

_________________
пишу я программу... и вдруг на клавиатуру выползает bug, буквально


 

Member
Статус: Не в сети
Регистрация: 30.07.2006
Откуда: Москва-Ярик
ExplodeR писал(а):
y:=Length(A[Length(A)])

Явный выход за границы массива A - ты обращаешся к элементу следующему за последним элементом массива (индексация динамических массивов ведь с нуля идет).
Вот работоспособный пример:

Код:
{$APPTYPE CONSOLE}
type
    TDynamicMatrix = array of array of Integer;

var da: TDynamicMatrix;
    x, y: Integer;
begin
  SetLength (da, 5);
  for y := 0 to Length (da) - 1 do
   begin
    SetLength (da [y], y + 5);
    for x := 0 to Length (da [y]) - 1 do
        da [y][x] := x;
   end;
  // Output and release
  for y := 0 to Length (da) - 1 do
   begin
    for x := 0 to Length (da [y]) - 1 do
        Write (da [y][x], ' ');
    WriteLn;
    SetLength (da [y], 0);
   end;
 SetLength (da, 0);
 Readln;
end.

_________________
Плавайте поездами Аэрофлота!
И синий BSOD нам заменяет небосвод...


 

Junior
Статус: Не в сети
Регистрация: 06.04.2006
alpet, спасибо.


 

Member
Статус: Не в сети
Регистрация: 11.07.2004
Откуда: Москва
ну а мне кто нибудь подскажет :(


 

Товарищи помогите плиз нерадивому студенту.

1. Изобразить на экране движение отрезка, концы которого скользят по координатным осям.

2. Изобразить на экране движение тела, брошенного под углом к горизонту.
x=V*t*cos(a); y=V*t*sin(a)-gt^2/2; S=V^2*sin(2a); H=V^2*sin^2(a)/2g

Заранее, пасибо большое.


 

Member
Статус: Не в сети
Регистрация: 16.04.2006
Откуда: d3d9.dll
Фото: 7
Вторую неделю воюю с СОМ-портами. :) Корректно открывать/зарывать/настраивать + писать в СОМ-порты научился (ещё раз спасибо Rius за наводку). А вот с чтением - беда, - никак не хотят порты читаться. Мужики, если кто разбирается, подскажите плиз, где у меня косяк. Читаю из портов так:
Код:
  //Указываем стандартному драйверу следить за появлением данных в приёмном буфере
  SetCommMask(hCommFile, EV_RXCHAR);
  for k:=0 to (StrToInt(Edit2.Text)+StrToInt(Edit4.Text)-1) do begin
    if WaitCommEvent(hCommFile, TMask, nil) = True then begin
      ReadFile(hCommFile,InBuffer,1,BytesRead,nil);
      Memo1.Lines.Add(IntToStr(InBuffer[k])+' считано '+IntToStr(BytesRead)+' байт');
    end;
  end;

Пояснения: количество данных, которые надо прочесть, мне известно заранее. Оно равно сумме чисел из Edit2 и Edit4. Суть проблемы: при данном способе чтения из порта программа почемуто считывает лишь 2 первых байта (хотя в порт передаётся аж целых 15 байт). Никак не могу понять, почему так происходит. :?:


 

Member
Статус: Не в сети
Регистрация: 11.11.2004
Откуда: Челябинск
3 параметр ReadFile - число байт для считывания, надо ставить сразу 15, а уже потом разбирать сколько нужно из них.
но если ничего вообще не придёт, прога повиснет.

_________________
пишу я программу... и вдруг на клавиатуру выползает bug, буквально


 

Member
Статус: Не в сети
Регистрация: 16.04.2006
Откуда: d3d9.dll
Фото: 7
Rius
Да, Вы правы. Оказалось, что нужно считывать все байты что есть в данный момент в приёмном буфере. Сейчас кое-чего подправил - вроде работает. Но я сейчас могу проверить работу программы только в "режиме симуляции". Я у разъёма СОМ-порта замкнул перемычкой 2-ой и 3-ий контакт. Теперь в буфер приёмника поступают те данные, что я отправляю в буфер передатчика (т. е. читаю из порта то, что туда сам записал). Сейчас вроде работает, однако как всё будет работать в реальности сказать трудно. Сейчас записываю/читаю так:
Код:
////////////////////////////////////////
// Отправка в порт пакета с настройками измерений //
////////////////////////////////////////
  NumberWritten:=0; //Число фактически записанных байт
  BytesRead:=0;       //Число фактически считанных байт
  WriteFile(hCommFile,OutBuffer,15,NumberWritten,nil); //Записал
    for i:=0 to 14 do begin //Смотрим, что отправляли в порт
      Memo2.Lines.Add(IntToStr(OutBuffer[i])+' всего записано '+IntToStr(NumberWritten)+' байт');
    end;{for i}

////////////////////////////////////////
//        Чтение данных из порта          //
////////////////////////////////////////
    if WaitCommEvent(hCommFile, TMask, nil) = True then begin
      ClearCommError(hCommFile,Errors,@Stat);  //Сбрасываем флаг (так и не понял зачем это нужно, но без этого - не работает)
      InBytes := Stat.cbInQue;                 //Число байт во входном буфере
      ReadFile(hCommFile,InBuffer,InBytes,BytesRead,nil); //Прочитал
        for k:=0 to InBytes-1 do begin //Смотрим, что прочли из порта
          Memo1.Lines.Add(IntToStr(InBuffer[k])+' всего считано '+IntToStr(BytesRead)+' байт');
        end;{for k}
    end;{if WaitCommEvent}

Больше всего смущает, что чтение данных вроде как не в цикле. Боюсь что в порт поступит одна порция данных (скорее всего результат первого измерения), а программа её прочтёт и успокоится. А надо бы читать около 2000 данных (каждое данное - 3-ёхбайтное число), поступающих от устройства измерения в порт с интервалом порядка 100-150 мс.


 

Member
Статус: Не в сети
Регистрация: 11.11.2004
Откуда: Челябинск
Цитата:
Больше всего смущает, что чтение данных вроде как не в цикле. Боюсь что в порт поступит одна порция данных (скорее всего результат первого измерения), а программа её прочтёт и успокоится. А надо бы читать около 2000 данных (каждое данное - 3-ёхбайтное число), поступающих от устройства измерения в порт с интервалом порядка 100-150 мс.
на этот случай есть аинхронное считывание с порта, в компонентах для работы с портами это делают как событие, event, на приём и отправку.

_________________
пишу я программу... и вдруг на клавиатуру выползает bug, буквально


 

Member
Статус: Не в сети
Регистрация: 16.04.2006
Откуда: d3d9.dll
Фото: 7
Да, я нашёл неплохой компонентик с подробной русской справкой для работы с СОМ-портами (BComPort). Но пока в нём не разбирался. Хочу попробовать сам на API-функциях что-нибудь написать (пускай и очень криво :)).
Но чтение с порта я всё-таки зациклил. Однако, если вдруг прочту 5999 байт вместо ожидаемых 6000 байт (число байт, которые надо будет прочесть, я знаю заранее), то прога просто повиснет (зациклится). Нужна защита от зацикливания. Пока никак не придумаю таковую. Сейчас читаю в цикле следующим образом:
Код:
    while b<WaitBytes do begin //Пока не прочли столько байт, сколько ожидаем
      //Будем ждать появления данных во входном буфере
      if WaitCommEvent(hCommFile, TMask, nil) = True then begin
        ClearCommError(hCommFile,Errors,@Stat);  //Сбрасываем флаг и получаем статус порта
        InBytes := Stat.cbInQue;                 //Число байт во входном буфере
        ReadFile(hCommFile,InBuffer,InBytes,BytesRead,nil);
        b:=b+BytesRead; //Обновляем информацию о общем кол-ве прочитанных байт
          for k:=0 to InBytes-1 do begin //Смотрим, что прочли из порта
            Memo1.Lines.Add(IntToStr(InBuffer[k])+' всего считано '+IntToStr(BytesRead)+' байт');
          end;{for k}
      end;{if WaitCommEvent}
      FlushFileBuffers(hCommFile); //Очищаем буферы, чтобы 2-ой раз не прочесть то, что уже прочли
    end;{while b<WaitBytes}


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 2317 • Страница 87 из 116<  1 ... 84  85  86  87  88  89  90 ... 116  >
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: Bing [Bot] и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan