Перейти к содержанию
Fire Monkey от А до Я
  • 0

настройки при чтении с Com порта, Windows


Alex7wrt

Вопрос

Пытаюсь считывать данные с ком порта (RS232).

При считывании иногда происходит сдвиг строки на байт, из-за чего происходят ошибки при обработке поступающих данных:

2552525017500200333610166057255
25250175002001410166053255252
501750020034361016615725525250
1750020024101661532552525017
50020036361016635725525250175
002004410166353255252501750
02004036101651582552525017500
200841016515425525250175002
Тогда как правильно должно быть, чтобы каждая строка начиналась на 25. В сторонних прогах работы с ком портом всегда так и есть.

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

Вот параметры работы ком порта, от изготовителя устройства:

1.PNG.5bcb5c131be90c5703a41697fffec752.PNG

Вот как я настраиваю порт в программе: 

procedure TForm1.Button1Click(Sender: TObject);
begin
ComFile:=CreateFile('com2',GENERIC_READ,0,nil,OPEN_EXISTING,FILE_ATTRIBUTE_READONLY,0);
if ComFile=INVALID_HANDLE_VALUE then begin
    ShowMessage('Не удалось открыть порт ');
 exit;
end;
SetupComm(ComFile,18,18);
GetCommState(ComFile,DCB);
with DCB do begin
    BaudRate:=57600;
    ByteSize:=8;
    Parity:=NoParity;
    StopBits:=OneStopBit;
end;
if not SetCommState(ComFile,DCB) then begin
    ShowMessage('Порт не настроен');
    CloseHandle(ComFile);
    exit;
end;
StartComThread;
end;

procedure TCommThread.Execute;
begin
 Repeat
  QueryPort;
  Sleep(100);
 Until Terminated;
end;

rocedure TCommThread.QueryPort;
var MyBuff:array [0..17] of Char;
    i: byte;
Begin
    all_buf:='';
    FillChar(MyBuff,SizeOf(MyBuff),#0);
    ReadFile(ComFile,MyBuff,SizeOf(MyBuff),BytesRead,Nil);
    If BytesRead>0 Then Begin
        for i:=0 to length(Mybuff)-1 do begin
            all_buf:=all_buf+inttostr(ord(MyBuff[i]));
        end;
       // Form1.Memo1.Lines.Add(all_buf);
    End;
end;

Где может быть ошибка?

Ссылка на комментарий

Рекомендуемые сообщения

  • 0
12 часа назад, Alex7wrt сказал:

Где может быть ошибка?

В синхронизации. С чего вы решили, что по ReadFile ваш прибор, подключенный к ком порту должен передать или иметь в буфере сом порта именно "правильную" строку? Думаю, надо после приема производить разборку принятой строки и формировать требуемую вам. 

Изменено пользователем GASCHE
Ссылка на комментарий
  • 0

COM-порт это потоковая штуковина. Считайте, что с точки зрения компьютера работа с ком-портом это получение / отправка непрерывного потока данных.

Ни компьютер, ни подключенное устройство не имеют ни малейшего представления о том, что вы ожидаете какой-то конкретный ограниченный по объему набор байт. Они отдают ровно то, что есть в буфере на текущий момент.

Посему, правильно будет делать так:

одна часть приложения постоянно что-то читает из порта и добавляет считанное в конец общего буфера.

другая часть приложения выбирает с начала общего буфера данные до тех пор, пока не поймет, что "вот оно - сообщение полностью прочитано". И после этого считанное удаляет из начала буфера.

Ссылка на комментарий

Присоединяйтесь к обсуждению

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

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...