Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с непрерывным потоком данных, от COM порта 
:(
    Опции темы
RinOSpro
Дата 27.1.2009, 10:46 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Здравствуйте! Есть COM порт, с него нужно принимать данные и обрабатывать
Сейчас работаю через API CreateFile, ReadFile, WriteFile.

С COM порта идет непрерывный поток данных, мне нужно его обрабатывать и еще успевать выводить на экран результаты.

Все работает, но иногда данные теряются. К примеру должно быть, и что пришло:


5149 6159 7139 7149C0B83109319931 A9 3129311931A9311931899

5149 6159 71A9 3129311931A9311931899

потерялись

Как быть что делать даже если самая базовая операция ReadFile, глючит...
  Вверх
Virtuals
Дата 27.1.2009, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 476
Регистрация: 27.11.2006

Репутация: 4
Всего: 11



RinOSpro, 
код показывай, так небывает.

PM MAIL ICQ   Вверх
Alexeis
Дата 27.1.2009, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 16
Всего: 459



  Может и бывает если внутренний буфер переполняется. Обычно чтение из COM порта делают в отдельном потоке. Есть и куча примеров и готовых компонентов.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
RinOSpro
Дата 27.1.2009, 11:59 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Подскажите нормальный примерчик, асинхронной записи/чтения. 
И может есть какая книжка толковая, а то в статьях информация кусками...
  Вверх
Alexeis
Дата 27.1.2009, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 16
Всего: 459



Я вот использовал у себя TiaRS232 (см. атач)

Там примерно такой алгоритм.
Создаем и назначаем обработчик 
Код

  RS232 := TiaRS232.Create;
  RS232.OnRSReceived := DoOnReceiveEvent;


настариваем 
Код

  RS232.Properties.PortNum    := StrToInt(ComboBox1.Text[4]);//выбираю компорт
  RS232.Properties.Parity     := NOPARITY;//четность
  RS232.Properties.BaudRate   := CBR_115200;//скорость
  RS232.Properties.StopBits   := 0;
  RS232.UseSynchronizeReceive := false;//асинхронный режим
  RS232.Open;//открыли
  RS232.StartListner;//слушаем


Завершаем
Код

  RS232.StopListner;
  RS232.Close;

сам обработчик пришедших данных
Код

procedure TForm1.DoOnReceiveEvent(Sender: TObject; const aData: TiaBuf;
  aCount: Cardinal);//размер буфера в aCount
var
  DataBuf  : PAnsiChar;
begin
  DataBuf  := @aData[0];//буфер с данными
...........




Присоединённый файл ( Кол-во скачиваний: 35 )
Присоединённый файл  COM.zip 7,79 Kb


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Felan
Дата 27.1.2009, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 2.8.2007
Где: Самара

Репутация: 2
Всего: 7



ААААААААА,  smile  smile 

Собственно как автор сего творения хочу заявить, что
Цитата(Alexeis @  27.1.2009,  14:47 Найти цитируемый пост)
RS232.UseSynchronizeReceive := false;//асинхронный режим

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

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


Присоединённый файл ( Кол-во скачиваний: 34 )
Присоединённый файл  iaRS232.zip 7,97 Kb


--------------------
// Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного.
PM MAIL WWW ICQ   Вверх
Alexeis
Дата 27.1.2009, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 16
Всего: 459



Цитата(Felan @  27.1.2009,  12:05 Найти цитируемый пост)
не есть асинхронный режим.

  Т.е. режим всегда асинхронный? 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Felan
Дата 27.1.2009, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 2.8.2007
Где: Самара

Репутация: 2
Всего: 7



Ну в строгом смысле там вообще нет асинхронного режима. Он эмулируется постоянным чтением данных из вторичного потока. Если данные есть, то происходит событие.
Т.е. это событие вызывается из отдельного потока, то для работы в нем надо либо не использовать VCL, либо ставить этот флаг с тру, что бы он работал через Synchronize.

А так да... можно сказать, что всегда асинхронный.

Но можно и не запускать прослушку, можно самому читать (Receive). Тогда уже будет самый натуральный синхронный smile


--------------------
// Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного.
PM MAIL WWW ICQ   Вверх
Romikgy
Дата 27.1.2009, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 13
Всего: 146



есть асинхроный и без потоков, на событиях винды


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Alexeis
Дата 27.1.2009, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 16
Всего: 459



  А на счет внутренней буферизации кто-то что-то знает? Какой объем внутреннего буфера у винда, чтобы как-то оценить сколько времени можно не читать данные по COM порту.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Romikgy
Дата 27.1.2009, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 13
Всего: 146



SetupComm для установки буферов ( smile ) 
низкоуровневый фифо до 16 байт в обе стороны


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Alexeis
Дата 27.1.2009, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 16
Всего: 459



Цитата(Romikgy @  27.1.2009,  14:24 Найти цитируемый пост)
низкоуровневый фифо до 16 байт в обе стороны 

  Ну это совсем мало, у винды свой наверное куда по больше.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Felan
Дата 28.1.2009, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 2.8.2007
Где: Самара

Репутация: 2
Всего: 7



Цитата(Romikgy @  27.1.2009,  17:24 Найти цитируемый пост)
SetupComm для установки буферов ( smile ) 
низкоуровневый фифо до 16 байт в обе стороны 

Она устанавливает рекомендованные значения. Т.е. винда их может и не использовать. Если туда че-то не лезет, она будет автоматически его расширять.

Цитата(Alexeis @  27.1.2009,  17:42 Найти цитируемый пост)
Ну это совсем мало, у винды свой наверное куда по больше. 

Какой свой? Не думаю, что там есть какой-то свой.
Это все тот же. Вот до каких приделов он может расти... вот это вопрос smile Я не знаю.
Мне кажется, это ограничено только адресным пространством. Интересно, что будет потом? smile

ЗЫЖ На моей практике ни разу не переполнялся и ни разу данные не терялись (ну с учетом того, что передача была правильная, и в проводах ничего не потерялось).

Добавлено через 1 минуту и 14 секунд
Цитата(Romikgy @  27.1.2009,  16:39 Найти цитируемый пост)
есть асинхроный и без потоков, на событиях винды 

А можно его в мыло? Интересуют исходники, а то я как-то пытался сделать асинхронное чтение, но у меня оно глючно получилось.


--------------------
// Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного.
PM MAIL WWW ICQ   Вверх
Virtuals
Дата 28.1.2009, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 476
Регистрация: 27.11.2006

Репутация: 4
Всего: 11



Felan, 
Цитата

Мне кажется, это ограничено только адресным пространством. Интересно, что будет потом? 

хош скажу?
на всех виндах начиная от нт4 и до ХРsp3 если в порт идут данные непрерывным потоком, а ни одно приложение их не забирает, то !:
переполняется какойто там буфер, у драйвера порта сносит крышу, и все!!! порт неработает до перезагрузки виндов.
ЗЫ проверено лично и не раз.


Alexeis, 
Цитата

Ну это совсем мало,

для меня так наоборот совсем много, всегда отрубаю фифо, иначе фиг угадаеш когда посылка данных прекращается,... что ручками подергать ну там dtr.

пользую, компонент для портов (асинхроный с потоками, на событиях винды), и все ...

раз пошла такая пьянка вот...где спер незнаю, но вроде чет про автора есть...

так пользуем
Код

procedure TForm1.Comm321ReceiveData(Buffer: Pointer; BufferLength: Word);
var buf: array of Byte;
    s:ansistring;
    tmp:dword;
begin
s:='';
buf:=Buffer;
for tmp:=0 to BufferLength-1 do s:=s+inttohex(buf[tmp],2)+' ';
Memo1.Lines.Add(s);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Comm321.WriteCommData(pchar(edit1.Text),length(edit1.Text) );
end;

procedure TForm1.openClick(Sender: TObject);
begin
Comm321.StartComm;
end;



Это сообщение отредактировал(а) Virtuals - 28.1.2009, 13:05

Присоединённый файл ( Кол-во скачиваний: 29 )
Присоединённый файл  Comm32.rar 9,33 Kb
PM MAIL ICQ   Вверх
RinOSpro
Дата 28.1.2009, 14:01 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Я думаю моя проблема от того что мало себе представляю как физически устроен COM порт, и как работает.

Открываю порт:

Код

function TThreadIO.Open: Boolean;
var
  dcb: TDCB;
  CommTimeOuts: TCommTimeouts;
begin
  FHandle := CreateFile(PChar(FConnectionString),
                        GENERIC_READ or GENERIC_WRITE,
                        0, nil, OPEN_EXISTING,
                        FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED, 0);

  if FHandle <> INVALID_HANDLE_VALUE then
  begin
    SetupComm(FHandle, 512, 512);
    GetCommState(FHandle, dcb);
    dcb.BaudRate := 230400;
    dcb.ByteSize := 8;
    dcb.Parity := NOPARITY;
    dcb.StopBits := ONESTOPBIT;
    SetCommState(FHandle, dcb);

    CommTimeOuts.ReadIntervalTimeout := 2;
    CommTimeOuts.ReadTotalTimeoutMultiplier := 1;
    CommTimeOuts.ReadTotalTimeoutConstant := 1;
    CommTimeOuts.WriteTotalTimeoutMultiplier := 1;
    CommTimeOuts.WriteTotalTimeoutConstant := 1;

    SetCommTimeouts(FHandle, CommTimeOuts);
    PurgeComm(FHandle, PURGE_RXCLEAR);
    PurgeComm(FHandle, PURGE_TXCLEAR);

    FillChar(FOverlapped, SizeOF(TOverlapped), 0);
    FOverlapped.hEvent := CreateEvent(0, False, False, '');
  end;

  Result := (FHandle <> INVALID_HANDLE_VALUE);
end;


Читаю из порта вот так:

Код

function TThreadIO.ReadData(ACountByte: Integer): Boolean;
var
  i: Integer;
begin
  Result := False;
  try
    ClearBuf;
    if FHandle <> INVALID_HANDLE_VALUE then
    begin
      FOverlapped.Internal := 0;
      FOverlapped.InternalHigh := 0;
      FCount := 0;
      ReadFile(FHandle, FBuf, ACountByte, FCount, @FOverlapped);

      repeat
        Result := GetOverlappedResult(FHandle, FOverlapped, FCount, True);
      until Result;

      FOverlapped.Offset := FOverlapped.Offset + FCount;
    end;
  except
    Result := False;
  end;
end;


Пишу примерно так же...

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


  Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.1046 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.