|
Чтение из COM-порта без признака окончания передачи информации
|
|||
---|---|---|---|
#18+
Ситуация: на COM-порт поступают некие данные. Размер пакета - от 4 до 8 байт. Данные поступают не непрерывно - т.е., например, пришло 6 байт, потом пауза минут 5, потом пришло 8 байт, пауза 2 секунды, пришло еще сколько-то байт. Можно считать, что минимальная пауза передачи данных - 1 секунда. Данные не содержат никаких признаков начала/окончания передачи. EOF на порт также не поступает - пишущая сторона постоянно держит свой порт открытым. Плюс есть еще такой нюанс: в зависимости от причин непонятного характера, весь пакет можно сразу получить на единственном срабатывании DataReceived - т.е. весь пакет находится внутри буфера чтения порта. А иногда получение пакета происходит за несколько срабатываний DataReceived, т.е. в буфер чтения пакет попадает порциями. При этом эмпирически выяснено, что между срабатываниями DataReceived при получении одного пакета интервал не более 0.1 сек. Вопрос: каким образом можно при считывании очередного пакета сгенерировать событие для передачи данных на обработку? Навскидку в голову приходит решение держать в переменной класса-обертки над COM-портом время последнего срабатывания DataReceived, если разница текущего времени, и времени последнего срабатывания больше 1 сек., то началась передача новой порции данных, и предыдущую можно отдавать на обработку. Но требуется полученную порцию данных отдавать на обработку сразу, как только истечет минимальный интервал паузы передачи данных (та самая 1 секунда). В DataReceived запускать таймер с таймаутом в 1 сек. (и который по срабатыванию будет райзить событие для обработки), если новый DataReceived сработал с интервалом меньше 1 сек., то останавливать таймер, и запускать его заново? Вместо таймера запускать Task? Еще как-то? Как лучше поступить в вышеописанной ситуации? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2019, 15:05 |
|
Чтение из COM-порта без признака окончания передачи информации
|
|||
---|---|---|---|
#18+
WinterGraveyard, SetCommTimeouts из WinAPI ... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2019, 15:22 |
|
Чтение из COM-порта без признака окончания передачи информации
|
|||
---|---|---|---|
#18+
ИзопропилWinterGraveyard, SetCommTimeouts из WinAPI Спасибо за указание в нужном направлении - у SerialPort есть свойство ReadTimeout, при установке которого как раз вызывается SetCommTimeouts. По умолчанию оно равно бесконечности, мне просто нужно было на время чтения очередной порции выставить его в минимальный промежуток времени между поступлением порций. Сделал примерно так: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40.
... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2019, 14:06 |
|
|
start [/forum/topic.php?fid=20&msg=39783555&tid=1399060]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
378ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
49ms |
get tp. blocked users: |
2ms |
others: | 259ms |
total: | 731ms |
0 / 0 |