Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.10.2012, 18:13   #1
Demien
Форумчанин
 
Аватар для Demien
 
Регистрация: 01.08.2007
Сообщений: 222
Вопрос Проблеммы при чтении из COM порта

Читаю из порта:
Код:
Size:=30;
  ReadFile(hPort, Buffer, Size, NumberOfBytesReaded, nil);
Все прекрасно, пока передаются пакеты по 30 символов!
Часто в порту "шум возникает" и выскакивают, скажем 31 символ.
При последующем чтении из порта строки смещаются:
Код HTML:
GB,001832,001890,001550,001827
0GB,001832,001890,001550,00182
70GB,001832,001890,001550,0018
270GB,001832,001890,001550,001
8270GB,001832,001890,001550,00
18270GB,001832,001890,001550,0
018270GB,001832,001890,001550,
0018270GB,001832,001890,001550
Как почитить буфер порта после извлечения 30-ти байт?
Код:
PurgeComm(hPort, PURGE_TXABORT or PURGE_RXABORT or PURGE_TXCLEAR or PURGE_RXCLEAR) //мне не помогло;
Слыхал что можно "вычитать" остаток строки. Как это реализовать не зная точной длинны пакета?
Жить тоже вредно, от этого умирают!!!
Demien вне форума Ответить с цитированием
Старый 30.10.2012, 18:25   #2
xoodoo
Форумчанин
 
Регистрация: 11.04.2012
Сообщений: 212
По умолчанию

Цитата:
Часто в порту "шум возникает"
Судя по фрагменту лога никакой это не "шум".
И возникает он судя по тому же логу не "часто", а со стабильной и вполне закономерной периодичностью.
Отсюда напрашивается вывод что размер прикладного инф.пакета не 30, а 31 байт.
xoodoo вне форума Ответить с цитированием
Старый 30.10.2012, 18:34   #3
Demien
Форумчанин
 
Аватар для Demien
 
Регистрация: 01.08.2007
Сообщений: 222
По умолчанию

На данном примере я искуственно смоделировал шум!
В реальности происходит чего-то вроде:
Код HTML:
GB,001832,001890,001550,001827
GB,001832,001890,001550,001827
GB,001832,001890,001550,001827
GB,001832,001890,001550,00y827
GB,001832,001890,001550,003827
=GB,001832,001890,001550,00382
7GB,001832,001890,001550,00382
7GB,001832,001890,001550,00382
Моделировать приходиться через COM Port Data Emulator, так как нет сейчас возможности подключиться к устройству. (потому и "чего-то вроде")
Жить тоже вредно, от этого умирают!!!
Demien вне форума Ответить с цитированием
Старый 30.10.2012, 23:42   #4
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Код:
var Resive :array [0..255] of char;
    comstat: TComStat;
    mask, signal, temp, btr: dword;
    //
    str: string;
    i: Integer;
begin 
 ovr.hEvent:= CreateEvent(nil, true, true, nil);

 while true do begin
  WaitCommEvent(h, mask, @ovr);
  signal:= WaitForSingleObject(ovr.hEvent, INFINITE);

  if (signal = WAIT_OBJECT_0) then
   if (GetOverlappedResult(h, ovr, temp, true)) then begin



   if ((mask and EV_RXCHAR)<>0) then begin
      ClearCommError(h, temp, @comstat);
      btr:= comstat.cbInQue;
      str:= '';

      ReadFile(h, Resive, btr, temp, @ovr);
      for i:= 0 to temp-1 do
       str:= str + Resive[i];
      // визуализируем принятый пакет
      memo1.lines.add(str)
    end;
...
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при чтении файла Стремящийся Общие вопросы по Java, Java SE, Kotlin 4 03.07.2012 16:50
Ошибка при чтении из файла BEL9ILLI Общие вопросы C/C++ 3 13.01.2012 10:12
ошибка при чтении файла ongleb Общие вопросы C/C++ 17 30.07.2009 13:48
Проблема при чтении из файла Satorin Общие вопросы Delphi 2 17.12.2008 11:32
Ошибка при чтении БД из файла!! sting БД в Delphi 4 14.12.2008 22:23