murz Posted May 3, 2011 Share Posted May 3, 2011 Столкнулся с такой вот проблемой: Есть NPort 5110 в режиме RealCOM, радиомодем DataRadio T-96 и свое приложение (WinAPI). Связь с радиомодемом осуществляется с использованием управляющих сигналов RTS/CTS. C реальными портами (которые на шине) все работает. А с энпортом - не хочет. На модеме вижу постоянную передачу, осциллографом вижу что RTS от энпорта постоянно поднят. Не могу понять в чем может быть косяк - по документации RealCOM вроде должен передавать все сигналы. Есть какие-нибудь мысли как это можно побороть? Link to comment
Komantsev Posted May 3, 2011 Share Posted May 3, 2011 Добрый день! Посмотрите, пожалуйста, что говорит раздел "Мониторинг" утилиты NPort Administrator? См. наши рекомендации по мониторингу. Link to comment
murz Posted May 10, 2011 Author Share Posted May 10, 2011 Мониторинг не особо помог. Байты ходят, соединение есть, параметры порта устанавливаются, но это и так было видно. Дальнейшее изучение показало следующее: 1. Не работают вызовы WinAPI: EscapeCommFunction (h,SETRTS); - ошибка "недопустимый аргумент" EscapeCommFunction (h,CLRRTS); 2. dcb.fRtsControl = RTS_CONTROL_TOGGLE; SetCommState (h,&dcb); RTS всегда в высоком уровне, а не обрамляет передачу данных Операционки - XP SP3 х32 и 7 SP1 x64, версия драйвера 1.12. Драйвера пробовались и admin utility, и windows driver manager. Link to comment
Komantsev Posted May 10, 2011 Share Posted May 10, 2011 Добрый день! Сможете сделать протоколирование передачи данных утилитой Portmon? Осуществите обмен данными через обычный COM-порт компьютера и запротоколируйте этот обмен. Как я понимаю, этот обмен должен быть успешным. Затем такую же процедуру с теми же данными проделайте через NPort и также запротоколируйте. И пришлите получившиеся LOG-файлы для сравнения. P.S. Portmon на Windows 7 не работает. Так что надо будет его запустить на машине с XP. Link to comment
murz Posted May 10, 2011 Author Share Posted May 10, 2011 Вот, пожалуйста: Реальный COM1 и Moxa NPort. Там же картинки с осциллографа для наглядности. Канал А (красная линия) - RTS, канал B (синяя линия) - Tx. Link to comment
murz Posted May 10, 2011 Author Share Posted May 10, 2011 И можно заодно описание протокола IPSerial получить в почту? Link to comment
Komantsev Posted May 11, 2011 Share Posted May 11, 2011 И можно заодно описание протокола IPSerial получить в почту? Можно :-) По поводу управления RTS/CTS - сейчас программисты выясняют, в чем может быть дело. Link to comment
murz Posted May 11, 2011 Author Share Posted May 11, 2011 Спасибо за протокол. И подождем что скажут программисты Link to comment
_ebe_ Posted August 20, 2013 Share Posted August 20, 2013 Драйвер версии 1.17 от 17.01.13 г. Режим RealCom. Скорость 9600 бит/сек. Управление RTS через Device Control Block dcb.fRtsControl = RTS_CONTROL_TOGGLE и вызов Win API “EscapeCommFunction” по-прежнему не работают. Управлять RTS можно используя вызовы "GetCommState/SetCommState". Псевдокод, ниже. Некрасиво, но работает. GetCommState (h,&dcb); if (rts == SETRTS) dcb.fRtsControl = RTS_CONTROL_ENABLE; else if (rts == CLRRTS) dcb.fRtsControl = RTS_CONTROL_DISABLE; SetCommState (h,&dcb); Столкнулся с дугой проблемой. На приеме теряются байты. Передача запроса осуществляется одним вызовом WriteFile. Чтение ответного пакета выполняется 1-мя вызовами ReadFile: 1. 1 байт – синхрослово 2. 2 байта – заголовок содержащий длину ответа 3. «длина ответа» + 2 байта. «длина ответа» может быть от 1-го до 240 байт Первые два чтения заканчиваются успешно. Третье чтение, с высокой вероятность заканчивается тайм-аутом, прочитано на один байт меньше, чем требовалось. Подключил к последовательному каналу между модемом DataRadio и Moxa NPort 5110 анализатор протоколов. Вижу, что от модема в NPort ответный пакет передается полностью. Теряется 4..6 по счету байт ответного пакета. Значения байта самые разные, но место одно. Анализируя тайминги заметил, что перед потерявшимся байтом в потоке есть разрыв 0.2…0.4 мсек. Фрагмент трассировки, в квадратных скобках потерянный байт. АВГ 19 2013 17:09:05.43 CComDevice::ttywrite: <02 02 00 00 00 60 78 11 > АВГ 19 2013 17:09:05.50 CComDevice::ttyread: <02 > CComDevice::ttyread: requested 1 bytes, read 1 bytes CComDevice::ttyread: receive time: 0 sec 000005 usec АВГ 19 2013 17:09:05.56 CComDevice::ttyread: <02 0C > CComDevice::ttyread: requested 2 bytes, read 2 bytes CComDevice::ttyread: receive time: 0 sec 000005 usec АВГ 19 2013 17:09:07.87 CComDevice::ttyread: <A1 [E1] 9C C8 4C 4C FF FF FF FF FF 7F 85 84 > CComDevice::ttyread: requested 14 bytes, read 13 bytes CComDevice::ttyread: receive time-out: 2 sec 159351 usec Настройка драйвера сделана «игнорировать интервальный тайм-аут». См. фрагмент псевдокода. COMMTIMEOUTS to; to.ReadIntervalTimeout = 0; // 0 - interval timeout not used SetCommTimeouts (h,&to); Пробовал устанавливать «интервальный тайм-аут» в заведомо большое значение (4…6 мсек) картина не меняется, байт в начале 3-го чтения пропадает. Кто-нибудь сталкивался с такой проблемой? Что подскажите… Link to comment
Agibalov Posted August 20, 2013 Share Posted August 20, 2013 Здравствуйте! Какие данные при этом идут по сети? Посмотрите, пожалуйста, например, с помощью анализатора Wireshark, чтобы точно знать, теряются ли данные в NPort или на компьютере? Link to comment
_ebe_ Posted August 21, 2013 Share Posted August 21, 2013 Здравствуйте, установил WireShark. Настроил фильтр на IP адрес NPort и порты 950 и 966. Работает, вижу дампы пакетов в hex. Подскажите, как подстроить фильтр, чтобы анализировать данные приходящие с COM порта. Нет опыта, WireShark использую впервые. Внутри пакетов TCP не понимаю, где транспортитуемые данные, а где служебные протокола Moxa NPort. М.б. опубликуете рекомендуемую строку-настройку фильтра WireShark. Для сведения. Переписал программу на прием за 2 чтения. 1. запрос 3 байта (синхро + заголовок с длиной) 2. данные по длине пакета Ошибка продолжает присутствовать при втором чтении. Жду помощь в настройке WireShark. Спасибо. Link to comment
Agibalov Posted August 21, 2013 Share Posted August 21, 2013 Чтобы посмотреть, какие данные передаются в TCP-пакете, надо в среднем окне раскрыть Transmission Control Protocol и выбрать TCP Segment data. После этого, в нижнем окне подсветится содержимое пакета. Link to comment
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now