У меня есть терминал Cinterion TC65 к порту RS-232 которого подключен внешний прибор учета из которого необходимо тянуть информацию. Прибор общается по собственному протоколу фирмы изготовителя, но при этом имеет некоторое сходство с промышленным Modbus. Реализовав протокол в виде библиотеки J2ME я задумался о том, как с минимальными усилиями протестировать обмен с прибором. Оказалось, сделать это не так уж и просто ...
Чтобы проверить процедуры обмена, мне необходимо, с одной стороны видеть что посылает терминал прибору, а с другой стороны лицезреть ответные сообщения. Так как обмен информацией между устройствами физически происходит по последовательному каналу RS-232, достаточно каким-то образом завернуть данные в терминальную программу типа HyperTerminal. Вот такой план у меня нарисовался. Но как этот план реализовать?
Пошарив в интернете ничего дельного не нашел. Раздумывая на досуге о своей нелегкой доле разработчика я вдруг вспомнил, что компьютер имеет два последовательных порта. И тут меня осенило!, а что если TC65 подключить на COM1, прибор на COM2 компьютера и далее сделать программный проброс между портами? Звучит вроде реалистично. Осталось найти подходящую программу, самому ваять необходимый код как-то не очень хотелось, да и времени на это у меня не было.
Погрузившись опять в глубины интернета нашел проект com0com. С его помощью я и собираюсь реализовать задуманное. Итак приступим ...
Мне понадобяться следующие программы:
- com0com, с помощью которой я создам пару виртуальных портов COM3-COM4;
- hub4com, с помощью которой я организую проброс данных между портами COM1, COM2, COM3;
- gsmport38x или любая другая терминальная программа подключаемая на порт COM4, в которую будут поступать данные как с TC65, так и с опрашиваемого прибора через порт COM3.
Чтобы организовать проброс между портами COM1, COM2 с дублированием на порту COM3 создадим командный файл следующего содержания:
hub4com --route=0,1:0,1,2 --baud=9600 COM1 \
--baud=9600 COM2 --baud=9600 COM3
Все порты, участвующие в обмене данными должны быть выровнены по скорости. Проброс портов действует с момента старта командного файла и до его завершения, что очень удобно при отладке.
Последовательность действий при отладке тогда может выглядеть следующим образом:
- Загрузка очередной версии мидлета на борт TC65 через порт COM1 с помощью MES.
- Запуск мидлета на исполнение посредством терминальной программы через порт COM1 с помощью команды AT^SJRA.
- Запуск командного файла проброса портов. После этого доступ к портам COM1, COM2, COM3 будет недоступен. Любая попытка использовать порт будет генерировать ошибку.
- Подключение терминальной программы на порт COM4 для вывода обменной информации.
Следует заметить следующее. Мидлет после запуска командой AT^SJRA должен какое-то время работать вхолостую (без обмена), чтобы дать разработчику время на переключение и проброс портов.
Вывод отладочной информации настроен в дисковый файл TC65, чтобы не засорять канал обмена, хотя в первом приближении это можно и сделать.
Вывод отладочной информации настроен в дисковый файл TC65, чтобы не засорять канал обмена, хотя в первом приближении это можно и сделать.
P.S. Согласно спецификации протокола обмена с прибором СПТ941.10(11), последний ожидает установления сеанса связи на скорости 2400. Более того, если в течении 10 секунд после начала сеанса связи с прибором не ведется обмен, прибор переходит в режим ожидания сбрасывая свою скорость в 2400. Поэтому в режиме отладки с использованием программы com0com разумно установить для всех портов участвующих в обмене одну скорость равную 2400, а не более высокую, скажем 9600 или 19200.
P.Ss. Как показала практика, gsmport38x, как и PuTTy не годятся для наблюдения за сообщениями которыми обмениваются TC65 и опрашиваемый прибор. Дело в том, что эти терминальные программы, как впрочем я думаю и HyperTerminal (не проверял!) отображают содержимое обмена в виде символьной последовательности, а нужно в HEX. Так вот на этот случай можно использовать Advanced Serial Port Monitor от компании AGGsoftware. Эта программа помимо символьного вида может отображать канальные данные также и в HEX виде.