|
|
|
Fantom87 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 16.6.2007 Репутация: нет Всего: нет |
Доброго времени суток.
Проблема такого характера... На com-порт приходит 19 байт с интервалами межу каждым байтом примерно 1 миллисекунда. Примерно через 1 миллисекунду после последнего байта начинают идти следующие 19 байт. Как правильно рассчитать таймауты, чтбы разделить эти посылки. На данный момент программа принимает каждый байт поотдельности. |
|||
|
||||
xvr |
|
|||
Эксперт Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 8 Всего: 223 |
Никак. Это вряд ли возможно даже на уровне железа (в UART'е компа есть FIFO) И вообще вы разделом ошиблись, тут COM порт не обсуждают, местный COM - это Component Object Model |
|||
|
||||
Fantom87 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 16.6.2007 Репутация: нет Всего: нет |
Прошу прощение, за то что ошибся с разделом. Спешил, не разобрался что к чему =)
Тогда какой максимальный временой интервал допустим между байтами, чтобы они принимались одним пакетом? И поясните пожалуйста доступным языком, для чего нужны таймауты, как они работают и как их рассчитывать? |
|||
|
||||
xvr |
|
||||||
Эксперт Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 8 Всего: 223 |
Максимальный может быть любой. Вопрос в минимальном. Под Windows гарантированно нельзя настроить никакой таймаут, т.к. она не real-time ОС
Нужны они что бы гарантировать, что ваш вызов чтения из COM порта вернется через некоторое время. Использовать их для нарезки входящих байтов на пакеты крайне не рекомендуется.
http://msdn.microsoft.com/en-us/library/wi...v=vs.85%29.aspx |
||||||
|
|||||||
Fantom87 |
|
||||
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 16.6.2007 Репутация: нет Всего: нет |
С таймаутами понятно. А вот по поводу приема... Видимо я не правильно вопрос задаю=) Попробую еще раз.
При поступлении данных в ком-порт компьютера:
Код не мой, вот и разбираюсь сижу...
Внимание вопрос... Если байты приходят в com-порт подряд, без задержки, то заполняют массив. А когда между байтами есть задержка, то каждый байт записывается в bufrd[0], а остальные члены массива остаются нулевыми. То есть, как я понимаю, для приема каждого байта поток запускается по новой. Вот где та временнАя граница межуд байтами, до которой они принимаются в одном потоке. Или я принципиально что-то не так делаю? |
||||
|
|||||
xvr |
|
||||
Эксперт Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 8 Всего: 223 |
Код неправильный. Не надо ждать никаких WaitCommEvent, надо сразу звать ReadFile и ждать когда он выставит overlapped.hEvent
Потом через GetOverlappedResult проверяете успешно или нет произошло чтение и сколько именно прочиталось. Либо вообще отказаться от Overlapped режима (в вашем примере он нафиг не нужен) и просто звать ReadFile - когда вернется, тогда уже все будет прочтено (а сколько именно, вернется через 4х параметр)
Нет, поток один, а в нем крутится цикл
По истечению таймаута. Но надейться на то, что байты будут приходить какими то определенными группами нельзя. У вас будет периодически вызываться ReadPrinting на каждый принятый пакет, при этом размер пакета будет лежать в counter, а данные в bufrd (counter надо очищать сразу после выхода из ReadPrinting, и вообще работа с ним - явная бага в исходнике) Предсказать, какими именно кусками к вам в ReadPrinting будут сваливаться данные нельзя. Т.е. если девайс передает к примеру 10 байтов, то вас могут позвать 1 раз с 10 байтами, а могут позвать 2 раза с 5 байтами, или 2 раза с 2мя и 8ю байтами, или 10 раз с одним байтом, или вообще как угодно - но не более 10 раз и общая сумма байтов будет 10 |
||||
|
|||||
Fantom87 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 16.6.2007 Репутация: нет Всего: нет |
В общем вывод такой... Принимаем по одному байту, а конец пакета определяем по какому-нибудь стоповому байту.
Всем спасибо |
|||
|
||||
Dem_max |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: нет Всего: 39 |
-------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: COM/DCOM/ActiveX/ATL/CORBA | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |