|
0 / 0 / 0
Регистрация: 10.12.2016
Сообщений: 18
|
||||||
Опять про COM порт26.04.2017, 14:38. Показов 1485. Ответов 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 Опять про камеру Опять про массивы Опять же про сапу Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2.
При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
|
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут.
https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc
Первый документ красиво выглядит, но без схемы.
Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
|
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере".
Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
|
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти".
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2.
В качестве источника данных. . .
|
|
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер
Написал заготовку:
dotnet new console --aot -o UrlHandler
var items = args. Split(":");
var tag = items;
var id = items;
var executable = args;. . .
|
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3.
Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
|
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений.
9TO2GP2bpX4
a42b81fb172ffc12ca589c7898261ccb/
https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/
Слева синяя линия -. . .
|
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. .
Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
|