|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
17.07.2017, 07:33 | #1 |
Пользователь
Регистрация: 17.07.2017
Сообщений: 11
|
9 бит данных по COM-порту
Есть некое устройство (купюроприёмник), работающее по последдовательному порту по протоколу MDB (protocol, which is based on a Motorola 9-bit UART implemented as an 8-bit data value with an additional mode bit. The mode bit differentiates between ADDRESS and DATA bytes). Для реализации на PC рекомендуют использовать бит чётности.
Есть программа, работающая с этим устройством из-под Windows. Вот её обмен с устройством, записанный с помощью портмонитора (кусок, где непосредственно посылаются данные, при необходимости выложу всё): Код:
Код:
|
17.07.2017, 10:51 | #2 |
Пользователь
Регистрация: 15.07.2017
Сообщений: 31
|
Каковы возвращаемые значения функций API?
Код:
|
17.07.2017, 10:59 | #3 |
Пользователь
Регистрация: 17.07.2017
Сообщений: 11
|
|
17.07.2017, 11:25 | #4 |
Пользователь
Регистрация: 17.07.2017
Сообщений: 11
|
Можно и несколько более общих вопросов сформулировать:
1. Я правильно понимаю, что все манипуляции, например с SetCommState до того, как я вызову WriteFile порту на самом деле по барабану? Посмотрим на лог от работающей программы - в строке 31 установилось Parity: SPACE, потом в 36 - Parity: MARK, потом в 38 опять Parity: MARK. Это зачем? 2. Что происходило в программе когда в лог вывелась строка 34, там где IRP_MJ_DEVICE_CONTROL IOCTL: 0x1B009C ? 3. Как им удаётся сделать чистый IOCTL_SERIAL_SET_LINE_CONTROL ? Я меняю бит чётности путём вызова SetCommState, но в мониторе видно что при этом происходят и другие события - как в логе от строки 28 до строки 33. |
17.07.2017, 13:51 | #5 |
Программист
Участник клуба
Регистрация: 23.06.2009
Сообщений: 1,772
|
https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx
Покажите программу, посмотрю |
17.07.2017, 14:32 | #6 |
Пользователь
Регистрация: 17.07.2017
Сообщений: 11
|
Exe-шник брал отсюда: http://www.cashcode.com.ua/content/blogcategory/9/25/ файл MDB.exe, исходников ясное дело нету.
Работает жёстко по COM1, для того чтобы начался обмен приведенный в логе надо нажать кнопку Connect. |
17.07.2017, 14:32 | #7 | ||||
Форумчанин
Регистрация: 23.01.2016
Сообщений: 608
|
Цитата:
Цитата:
Код:
Цитата:
Цитата:
|
||||
17.07.2017, 14:44 | #8 |
Пользователь
Регистрация: 17.07.2017
Сообщений: 11
|
А как правильно? Что произойдёт непосредственно в порту при других вызовах (не считая установки RTS/CTS), без посылки байтов?
Угу. А как можно делать только SetLineControl ? (В работающей программе это им как-то удаётся). Спасибо, посмотрю, но только в качестве дополнительного источника информации. Окончательный обмен должен происходить из-под Линукса, под виндой решил отработать обмен потому-что был готовый эмулятор. |
17.07.2017, 14:49 | #9 |
Пользователь
Регистрация: 15.07.2017
Сообщений: 31
|
Можно попробовать вручную пообщаться с устройством через терминал:
https://sites.google.com/site/terminalbpp/ http://www.compt.ru/ru/index.php Кстати, у меня был такой баг, когда символ на COM-порт не принимался. Дело в том, что UART использует асинхронный протокол. Т.е. после отправки символа нет гарантий, что он успел прийдти и уже находится во входном буффере контроллера. Поэтому читать сразу нельзя. Поэтому, при программировании UART используются следующие походы: 1) ожидание поступления байта в буффер чтения и ожидание опустошения буффера отправки на основе прерываний (использование событий http://support.tenasys.com/INtimeHel...commevent.html http://support.tenasys.com/INtimeHel...tcommmask.html) 2) ручная проверка регистра состояния в цикле(этот вариант для DOS'а) https://www.lookrs232.com/rs232/lsr.htm 3) хак: вставка конкретной задержки после отправки символа(напр. 50 мсек), да и вообще после всех операций ввода-вывода. Возможно надо поэкспериментировать с длительностью задержки. |
17.07.2017, 15:23 | #10 | |
Пользователь
Регистрация: 15.07.2017
Сообщений: 31
|
Цитата:
https://msdn.microsoft.com/ru-ru/lib...(v=vs.85).aspx https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx Последний раз редактировалось agmag; 17.07.2017 в 15:38. |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Исправить код программы: Ввести с клавиатуры 8-разрядное двоичное число Х, установить младший бит этого числа так, чтобы количество единичных бит в двоичном числе Х стало четным | Zhan1234 | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 2 | 25.05.2017 12:41 |
Прием и передача данных по COM порту | PTyTb32 | Компоненты Delphi | 2 | 26.06.2015 22:12 |
Побитовый контроль передаваемых по COM порту данных | Lexa_kltn | C/C++ Сетевое программирование | 0 | 19.05.2011 14:39 |
Ковертирование из png 24 бит в png 8 бит | isat | Общие вопросы .NET | 0 | 22.03.2010 13:38 |
Подключиться к COM порту | doober | Общие вопросы .NET | 3 | 23.07.2009 13:34 |