|
0 / 0 / 0
Регистрация: 10.12.2016
Сообщений: 18
|
||||||
Опять про COM порт26.04.2017, 14:38. Показов 1433. Ответов 18
Метки нет (Все метки)
Здравствуйте. Наверняка данный вопрос уже неоднократно появлялся, но т.к. я к сожалению не программист, а скорей "железяньщик", то заранее прошу простить. Итак есть железка, которая принимает команды по последовательному порту, а потом по нему же передаёт некоторые данные, предварительно упакованные в пакет. Количество пакетов передаваемых между командами не ограничено. С портом я работаю с помощью ф-ций WINAPI (create file и т.д.). Всего в программе 3 потока (1 записи в порт, 1 чтения из порта и 1 активируется потоком чтения и осуществляет отображение данных в Memo и ListBox). Так вот мне понадобилось отображать содержимое принятых пакетов в строку (точнее 1пакет, 1 строка). Я сделал это следующим образом:
0
|
||||||
| 26.04.2017, 14:38 | |
|
Ответы с готовыми решениями:
18
Опять про связь таблиц Опять COM-порт опять про ПР |
|
|
||||||
| 26.04.2017, 15:58 | ||||||
|
Можно читать входящие данные фукцией ReadFile с overlapped и WaitForSingleObject. Тогда можно получить либо завершение операции (прочитано указанное число байт), либо таймаут. Таймаут можно задать больше, чем разбрасывает COM порт, но меньше, чем между посылками.
Добавлено через 3 минуты Вот пример
0
|
||||||
|
0 / 0 / 0
Регистрация: 10.12.2016
Сообщений: 18
|
|
| 26.04.2017, 17:54 [ТС] | |
|
0
|
|
|
|
|
| 26.04.2017, 17:55 | |
|
Если это пакеты, они должны быть как-то разделены. Это либо время (таймаут), либо содержимое (типа CR LF).
Время вы можете по осциллографу посмотреть. Содержимое - в сниффере или протоколе обмена.
0
|
|
|
0 / 0 / 0
Регистрация: 10.12.2016
Сообщений: 18
|
|
| 26.04.2017, 18:34 [ТС] | |
|
Ясно, спасибо!
0
|
|
|
|
|
| 26.04.2017, 18:38 | |
|
В случае, если разделение в содержимом, надо считывать постоянно и пополнять некий самодельный буфер FIFO. Как только он заполнился одним пакетом, т.е. в нём есть и маркер начала, и маркер конца, то из буфера пакет вычитывается и используется.
0
|
|
|
0 / 0 / 0
Регистрация: 10.12.2016
Сообщений: 18
|
|
| 26.04.2017, 21:36 [ТС] | |
|
А вот за мысль с fifo отдельное спасибо. Пакеты действительно отличаются содержимым а вот идут почти один за другим. Я прочитал про таймауиы для com порта, но не совсем понял как мне это может помочь, а вот с вашем кодиком всё стало намного яснее. Завтра с утра поэксперементирую.
0
|
|
|
0 / 0 / 0
Регистрация: 10.12.2016
Сообщений: 18
|
||||||
| 28.04.2017, 10:59 [ТС] | ||||||
|
Снова здравствуйте. Опять появилась проблема с портом. Уму не приложу в чём дело. В общем железяка работает нормально, поэтому пока с таймаутаи решил не заморачиваться. Но появилась другая напасть. Каждый пакет, который мне приходит состоит из 14 байт, при этом я знаю, что каждый пакет начинается с цифры 0х02. Т.к. в содержимом пакета такая цифра то же может появиться, решил сделать синхронизацию следующим образом: выделить 42-х байтный буфер (3х14) а в функции чтения порта указал 14 байт. Когда с порта приходят данные, я записываю их в старшие 14 байт выделенного буфера. Далее я проверяю равны ли 0 и 14 байты буфера 0х2. Если да, то делаю вывод, что за синхронизировался и выдаю данные. Если нет, то, сдвигаю весь 42-байтный блок на 1 в сторону младших разрядов и снова проверяю. Эта операция повтаряется 14 раз (пока младшие 14 байт полностью не выдвинутся из буфера). Вот мой код потока обработки:
0
|
||||||
|
|
||
| 28.04.2017, 11:12 | ||
|
От сдвига избавьтесь. Есть такой способ как кольцевой буфер.
У вас отдельный поток вроде есть. Читайте в нём не однократно 14 байт, а постоянно: 14, 14, 14,... И всё принятое записывайте в хвост вышеуказанного буфера. Добавьте такое понятие, которое назовём "окном проверки". В него будут попадать первые 14 байт от головы буфера. После каждого завершения чтения, или по таймауту, проверяйте наличие в окне набора байт, подходящего под описание пакета. Если не подходит, первый байт из головы выбрасываете (окно сдвигается далее), и проверяете снова. Если подходит, забираете из буфера и обрабатываете. А вообще вот такого: Приведите описание протокола.
0
|
||
|
0 / 0 / 0
Регистрация: 10.12.2016
Сообщений: 18
|
||||||||
| 28.04.2017, 11:39 [ТС] | ||||||||
|
Разобрался. В строке
Добавлено через 11 минут Rius, а Вы не могли бы поподробней объяснить, как читать голову буфера, если я пакеты записываю ему в хвост, так или иначе мне сдвигать то всё и так и так придётся...
0
|
||||||||
|
0 / 0 / 0
Регистрация: 10.12.2016
Сообщений: 18
|
|
| 28.04.2017, 11:51 [ТС] | |
|
Ясно, спасибо ещё раз.
0
|
|
|
|
||
| 02.05.2017, 21:11 | ||
|
2. Вместо WinApi лучше попробуйте использовать компонент(модуль) BComPort. (Или вообще другой фрейморк/ЯП)
0
|
||
|
0 / 0 / 0
Регистрация: 10.12.2016
Сообщений: 18
|
|
| 02.05.2017, 23:03 [ТС] | |
|
А можете поподробней рассказать или какую нибудь ссылочку дать почитать... Или каким нибудь примерчиком угостить. А то про COM порт везде одно и тоже, открываем, передаём байтик, его же сразу же читаем, закрываем порт. Всё! Для начала, конечно не плохо, но практического применения никакого...
0
|
|
|
0 / 0 / 0
Регистрация: 10.12.2016
Сообщений: 18
|
|
| 03.05.2017, 15:24 [ТС] | |
|
0
|
|
|
|
|
| 03.05.2017, 15:50 | |
|
Так в других случаях все просто, алгоритм таков:
1. Включаем мозг. 2. Смотрим пример с принятием байтика. 3. Думаем головой (и не чем другим). 4. И реализуем код на его основе. 5. Можем выключать мозг )))
0
|
|
|
Практикантроп
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
|
|
| 03.05.2017, 15:55 | |
|
0
|
|
|
0 / 0 / 0
Регистрация: 10.12.2016
Сообщений: 18
|
|
| 03.05.2017, 17:36 [ТС] | |
|
0
|
|
| 03.05.2017, 17:36 | |
|
Помогаю со студенческими работами здесь
19
Опять про ПР... :/ Опять про layout Опять про камеру Опять про массивы Опять же про сапу Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
|
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11
— это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
|
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11
Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
|
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
|
|
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/
O1rJuneU_ls
https:/ / vkvideo. ru/ video-115721503_456239114
|
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ВВЕДЕНИЕ
Введу сокращения:
аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
|
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi
ветка по-частям.
коммит Create переделка под биомассу. txt
вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
|
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ *
Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во
всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
|