|
|
|
правильный парсинг данных приходящих с com порта.
|
|||
|---|---|---|---|
|
#18+
Добрый день форумчане программисты. Нужна ваша помощь. Устройство подключено к компьютеру через com порт. Данные получаю, с этим проблем нету. Код читается этим блоком. Код: 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. А именно этой строкой Код: c# 1. 2. 3. 4. Вот как выглядит одно целое сообщение отправляемое устройством Код: plaintext 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. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. Там где видите знак {!!!!!} означает что буфер чтения заполнился и данные считались в переменную. Это произошло в три раза, то есть одно сообщение считалось тремя блоками. А если больше одного сообщения отправит устройство, то в буфер могут попасть конец одного сообщения и начала другого сообщения. Как мне правильно распарсить данные, найти нужный момент для этого? Ведь нужное мне сообщение разделилось в 3 три блока, а размер сообщения пока неизвестно. Любые идеи, размышления будут полезны. У меня самого опыта работы с com портами нету. Но работу надо сделать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2017, 06:49 |
|
||
|
правильный парсинг данных приходящих с com порта.
|
|||
|---|---|---|---|
|
#18+
Спросить у разработчиков устройства (найти в документации по устройству), как определить конец сообщения для этого конкретного устройства... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2017, 09:18 |
|
||
|
правильный парсинг данных приходящих с com порта.
|
|||
|---|---|---|---|
|
#18+
COM-порт выдает поток байт, а дальше сам режь/клей сообщения. Полученный блок данных может обрываться на любом символе. Как понимаю это текст с переводами строк, парси буфер построчно выискивая "\n". Если буфер кончился, а "\n" не было, значит это часть строки, ставь ее в начало следующего буфера и дальше читай из порта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2017, 10:43 |
|
||
|
правильный парсинг данных приходящих с com порта.
|
|||
|---|---|---|---|
|
#18+
Помидор, Изучить технологию конечного автомата . Помнить указатель на буфер и шаг парсинга независимо от состояния читающего потока. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2017, 11:05 |
|
||
|
правильный парсинг данных приходящих с com порта.
|
|||
|---|---|---|---|
|
#18+
BarloneСпросить у разработчиков устройства (найти в документации по устройству), как определить конец сообщения для этого конкретного устройства... Сейчас занимаюсь этим, но они точно в эту неделю не ответят. А хочется быстрее, время поджимает. Dima TCOM-порт выдает поток байт, а дальше сам режь/клей сообщения. Полученный блок данных может обрываться на любом символе. Как понимаю это текст с переводами строк, парси буфер построчно выискивая "\n". Если буфер кончился, а "\n" не было, значит это часть строки, ставь ее в начало следующего буфера и дальше читай из порта. Текст перевода строки я вставляю сам, а чтобы здесь это было заметно я обозначил конец буфера знаком {!!!!!}. Вашу идею понял, буду искать конец сообщения. Она у меня выходила как абракадабра, до него есть строка age. Получается можно ориентироваться на это поле. Попробую. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2017, 11:23 |
|
||
|
правильный парсинг данных приходящих с com порта.
|
|||
|---|---|---|---|
|
#18+
SiemarglПомидор, Изучить технологию конечного автомата . Помнить указатель на буфер и шаг парсинга независимо от состояния читающего потока. Попробую. Хотел быстрым наскоком, ничего не понял. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2017, 11:33 |
|
||
|
правильный парсинг данных приходящих с com порта.
|
|||
|---|---|---|---|
|
#18+
ПомидорА если больше одного сообщения отправит устройство, то в буфер могут попасть конец одного сообщения и начала другого сообщения.Ну обычно устройства предпочитают отправлять данные в некоем предопределённом порядке... и зачастую этого достаточно для идентификации границы пакета данных. Тупо каждому полю пакета ставим в соответствие некий внутренний псевдономер, и уменьшение этого номера для текущего поля по сравнению с предыдущим означает, что пройдена граница пакета данных. Это даже при условии, что в пакете отсутствуют поля и/или маркеры начала/конца пакета. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2017, 11:39 |
|
||
|
правильный парсинг данных приходящих с com порта.
|
|||
|---|---|---|---|
|
#18+
Вот полное сообщение. Код: plaintext 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. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. Вроде есть начало (VDSNO 120) и конец (1F) сообщения. Только что они значат и как их ловить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2017, 15:38 |
|
||
|
правильный парсинг данных приходящих с com порта.
|
|||
|---|---|---|---|
|
#18+
ПомидорВроде есть начало (VDSNO 120) и конец (1F) сообщения. Скорее VD и 1F ПомидорТолько что они значат и как их ловить? Алгоритм следующий: 1. Читаешь, пока не поймаешь [начало] 2. Очистка приемного буфера 3. Читаешь и складываешь в буфер, пока не поймаешь [конец] 4. Передаешь буфер на обработку (можно без символов [начало] и [конец]) 5. Переход к п.1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2017, 16:07 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=39485863&tid=1340344]: |
0ms |
get settings: |
7ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
137ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
| others: | 226ms |
| total: | 460ms |

| 0 / 0 |
