понедельник, 20 августа 2012 г.

Мониторинг обмена между TC65 и внешним устройством RS-232

У меня есть терминал Cinterion TC65 к порту RS-232 которого подключен внешний прибор учета из которого необходимо тянуть информацию. Прибор общается по собственному протоколу фирмы изготовителя, но при этом имеет некоторое сходство с промышленным Modbus. Реализовав протокол в виде библиотеки J2ME я задумался о том, как с минимальными усилиями протестировать обмен с прибором. Оказалось, сделать это не так уж и просто ...

Чтобы проверить процедуры обмена, мне необходимо, с одной стороны видеть что посылает терминал прибору, а с другой стороны лицезреть ответные сообщения. Так как обмен информацией между устройствами физически происходит по последовательному каналу RS-232, достаточно каким-то образом завернуть данные в терминальную программу типа HyperTerminal. Вот такой план у меня нарисовался. Но как этот план реализовать?

Пошарив в интернете ничего дельного не нашел. Раздумывая на досуге о своей нелегкой доле разработчика я вдруг вспомнил, что компьютер имеет два последовательных порта. И тут меня осенило!, а что если TC65 подключить на COM1, прибор на COM2 компьютера и далее сделать программный проброс между портами? Звучит вроде реалистично. Осталось найти подходящую программу, самому ваять необходимый код как-то не очень хотелось, да и времени на это у меня не было.

Погрузившись опять в глубины интернета нашел проект com0com. С его помощью я и собираюсь реализовать задуманное. Итак приступим ...

Мне понадобяться следующие программы:
  1. com0com, с помощью которой я создам пару виртуальных портов COM3-COM4;
  2. hub4com, с помощью которой я организую проброс данных между портами COM1, COM2, COM3;
  3. gsmport38x или любая другая терминальная программа подключаемая на порт COM4, в которую будут поступать данные как с TC65, так и с опрашиваемого прибора через порт COM3.
На схеме выше видно как данные, циркулируют между устройствами, попадая на порт терминальной программы.

Чтобы организовать проброс между портами COM1, COM2 с дублированием на порту COM3 создадим командный файл следующего содержания:

   hub4com --route=0,1:0,1,2 --baud=9600 COM1 \
      --baud=9600 COM2 --baud=9600 COM3

Все порты, участвующие в обмене данными должны быть выровнены по скорости. Проброс портов действует с момента старта командного файла и до его завершения, что очень удобно при отладке.

Последовательность действий при отладке тогда может выглядеть следующим образом:
  1. Загрузка очередной версии мидлета на борт TC65 через порт COM1 с помощью MES.
  2. Запуск мидлета на исполнение посредством терминальной программы через порт COM1 с помощью команды AT^SJRA.
  3. Запуск командного файла проброса портов. После этого доступ к портам COM1, COM2, COM3 будет недоступен. Любая попытка использовать порт будет генерировать ошибку.
  4. Подключение терминальной программы на порт COM4 для вывода обменной информации.
Следует заметить следующее. Мидлет после запуска командой AT^SJRA должен какое-то время работать вхолостую (без обмена), чтобы дать разработчику время на переключение и проброс портов.

Вывод отладочной информации настроен в дисковый файл 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 виде.