У меня есть USB-ARINC429 адаптер. Пока устройства передающие данные были простыми - хорошо работал простой код: поиск правильной последовательности и отбрасывание лишнего. Сейчас же я работаю с устройством, которое не дублирует посылки и ничего отбрасывать недопустимо. Я почитал тему viewtopic.php?p=91457#p91457 и ей сопутствующие. Задача не так проста как казалась на первый взгляд. Предлагаю всем желающим поупражняться. Будет полезное дело для сообщества. Если не в коде, то, предлагайте алгоритмы. Буду кодить - обсудим что получилось.
Итак, протокол текстовый. Данные могут быть любыми, поэтому спецсимволы для окончания строки не используются. Адаптер выдает данные по 5 байт (это длина сообщения). Каждая 16я посылка - 5-ти байтное слово синхронизации 7733773377 (HEX) или w3w3w (ASCII). Самая проблема: бывает что USB адаптер переподключают, или помехи, или еще что то - тогда в буфере не 5 байтовое сообщение а меньше. То есть синхронизироваться по первому слову - нормально, но хорошо бы и по следующему проверить целостность.
Дамп:
Код: Выделить всё
41EE 0100 8259 8ACE 41E8 81FF 0759 92C2 7733 7733 7733 7733 41EE 0100 8259 92E0 41FF 0101 8059 92FE 41EE 0100 8259 9A9A 41EE 0100 8259 A274 41E8 81FF 0759 A676 41EE 0100 8259 AA4E 41EE 0100 8259 B228 41E8 81FF 0759 BA1C 41EE 0100 8259 BA3A 41FF 0101 8059 BA58 41EE 0100 8259 C1F4 4100 AAC3 F759 C514 4100 C377 2A59 C53E 4100 AAC3 F759 C6A8 4100 C377 2A59 C6D2 7733 7733 7733 7733 41EE 0100 8259 C9D0 41E8 81FF 0759 CDD4 41EE 0100 8259 D1AA 41EE 0100 8259 D984 41E8 81FF 0759 E17A 41EE 0100 8259 E196 41FF 0101 8059 E1B4 41EE 0100 8259 E950 41EE 0100 8259 F12A 41E8 81FF 0759 F52C 41EE 0100 8259 F904 41EE 0100 825A 00DE 4100 AAC3 F75A 026C 4100 C377 2A5A 0296 4100 AAC3 F75A 0400 7733 7733 7733 7733 4100 C377 2A5A 042A 41E8 81FF 075A 08D6 41EE 0100 825A 08F2 41FF 0101 805A 0910 41EE 0100 825A 10AC 41EE 0100 825A 1886 41E8 81FF 075A 1C88 41EE 0100 825A 2060 41EE 0100 825A 283A 41E8 81FF 075A 3032 41EE 0100 825A 304E 41FF 0101 805A 306C 41EE 0100 825A 37EE 4100 AAC3 F75A 3FC6 41EE 0100 825A 3FE4 7733 7733 7733 7733 4100 C377 2A5A 4002 4100 AAC3 F75A 416A 4100 C377 2A5A 4194 41E8 81FF 075A 43E0 41EE 0100 825A 47B8 41EE 0100 825A 4F90 41E8 81FF 075A 5786 41EE 0100 825A 57A4 41FF 0101 805A 57C0 41EE 0100 825A 5F5E 41EE 0100 825A 6738 41E8 81FF 075A 6B3A 41EE 0100 825A 6F12 41EE 0100 825A 76EC 4100 AAC3 F75A 7D30 7733 7733 7733 7733 4100 C377 2A5A 7D5A 4100 AAC3 F75A 7EC8 41E8 81FF 075A 7EE8 4100 C377 2A5A 7F06 41EE 0100 825A 7F22 41FF 0101 805A 7F40 41EE 0100 825A 86AA 41EE 0100 825A 8E84 41E8 81FF 075A 9288 41EE 0100 825A 965E 41EE 0100 825A 9E38 41E8 81FF 075A A62E 41EE 0100 825A A64A 41FF 0101 805A A668 41EE 0100 825A AE04 7733 7733 7733 7733 41EE 0100 825A B5E0 41E8 81FF 075A B9E2 4100 AAC3 F75A BA90 4100 C377 2A5A BABC 4100 AAC3 F75A BC24 4100 C377 2A5A BC4E 41EE 0100 825A BDBA 41EE 0100 825A C594 41E8 81FF 075A CD8A 41EE 0100 825A CDA6 41FF 0101 805A CDC4 41EE 0100 825A D560 41EE 0100 825A DD3C 41E8 81FF 075A E13E 41EE 0100 825A E514 7733 7733 7733 7733 41EE 0100 825A ECEE 41E8 81FF 075A F4E6 41EE 0100 825A F502 41FF 0101 805A F520 4100 AAC3 F75A F7EA 4100 C377 2A5A F814 4100 AAC3 F75A F97C 4100 C377 2A5A F9A6 41EE 0100 825A FCA4 41EE 0100 825B 047E 41E8 81FF 075B 0880 41EE 0100 825B 0C58 41EE 0100 825B 1432 41E8 81FF 075B 1C28 41EE 0100 825B 1C44 7733 7733 7733 7733 41FF 0101 805B 1C62 41EE 0100 825B 23FE 41EE 0100 825B 2BD8 41E8 81FF 075B 2FDC 41EE 0100 825B 33B4 4100 AAC3 F75B 3540 4100 C377 2A5B 356C 4100 AAC3 F75B 36D4 4100 C377 2A5B 36FE 41EE 0100 825B 3B8E 41E8 81FF 075B 4384 41EE 0100 825B 43A2 41FF 0101 805B 43BE 41EE 0100 825B 4B5A 41EE 0100 825B 5334 7733 7733 7733 7733 41E8 81FF 075B 573A 41EE 0100 825B 5B10 41EE 0100 825B 62E8 41E8 81FF 075B 6ADE 41EE 0100 825B 6AFC 41FF 0101 805B 6B18 4100 AAC3 F75B 72B4 41EE 0100 825B 72D0 4100 C377 2A5B 72EE 4100 AAC3 F75B 7456 4100 C377 2A5B 7482 41EE 0100 825B 7AA4 41E8 81FF 075B 7EA6 41EE 0100 825B 827E 41EE 0100 825B 8A56 7733 7733 7733 7733 41E8 81FF 075B 924C 41EE 0100 825B 926A 41FF 0101 805B 9286 41EE 0100 825B 9A24 41EE 0100 825B A1FE 41E8 81FF 075B A600 41EE 0100 825B A9D8 4100 AAC3 F75B B01C 4100 C377 2A5B B046 4100 AAC3 F75B B1B0 41EE 0100 825B B1CE 4100 C377 2A5B B1EA 41E8 81FF 075B B9BC 41EE 0100 825B B9DA 41FF 0101 805B B9F6 7733 7733 7733 7733 41EE 0100 825B C17A 41EE 0100 825B C954 41E8 81FF 075B CD56 41EE 0100 825B D12E 41EE 0100 825B D908 41E8 81FF 075B E0FC 41EE 0100 825B E11A 41FF 0101 805B E136 41EE 0100 825B E8D4 4100 AAC3 F75B ED86 4100 C377 2A5B EDB0 4100 AAC3 F75B EF18 4100 C377 2A5B EF44 41EE 0100 825B F0AE 41E8 81FF 075B F4B2 7733 7733 7733 7733 41EE 0100 825B F88A 41EE 0100 825C 0064 41E8 81FF 075C 0858 41EE 0100 825C 0876 41FF 0101 805C 0894 Сообщения нужно проверять не реже чем раз в 20 мс. То есть подождать пока появится синхрослово - не получится. Оно может и раз в 5 секунд приходить, а может и 5 раз за секунду.
---
У меня пока такая идея:
1 Опрашиваем VISA по таймауту 10 мс. Все данные складываем в буфер (какой? Сдвиговый регистр? Очередь?).
2 В соседнем цикле, с такой же задержкой после начала обмена ждем синхрослово. Все что до него - удаляем.
3 После синхрослова берем из буфера по 5 байт. Остаток - возвращаем в буфер (а как возвращать? А если VISA в соседнем цикле допишет в этот момент данные?)
4 Продолжаем брать по 5 байт, но в целом буфере ищем синхрослово. Если нашлось, проверяем, не было ли потерь. Если до него слова не укладываются по 5, то отбрасываем их?

