LINUX.ORG.RU

Работа с COM портом

 , ,


0

1

Всем привет!

Есть проблема в работе с COM портом.

Пишу программу, работающую с устройством. Все работает, кроме одного НО : самая первая команда до устройства не доходит.

Есть пример программы с похожим функционалом на питоне, там начало работы с устройством выглядит так :

ser = serial.Serial(PORT, 115200,\
                            parity=serial.PARITY_NONE,\
                            stopbits=serial.STOPBITS_ONE,\
                            timeout=0.7,\
                            writeTimeout=0.7)
Т.е. создается экземпляр питоньего класса по работе с портами.

Никак не могу повторить то же самое в Java ( работаю с устройством как с файлом средствами FileInputStream и FileOutputStream ). Первая команда после загрузки оборудования ВСЕГДА не доходит до принтера. И не только в Java. Пробовал cat /dev/ttyUSB(n) - аналогично.

Пришел к выводу что это что-то на уровне ОС. Дистрибьютив Ubuntu 12.04.

В принципе проблема у меня как таковая решена - есть маленький скрипт на питоне, висит в автозагрузке. Плюс я могу вызвать его из своего ПО. Но на мой взгляд это костыль, хотелось бы от него избавится.

Буду благодарен за наводку.



Последнее исправление: maxcom (всего исправлений: 1)

Натрави strace -f -s 128 на обе программы и сравни их. От явы, правда, будет очень много выхлопа...

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

В питоньем скрипте есть строка

open(«/dev/ttyUSB0», O_RDWR|O_NOCTTY|O_NONBLOCK) = 3

Есть ли где-нибудь описание функции open, чтобы я мог посмотреть как сделать что-то похожее на Java?

Erhaben
() автор топика

У некоторых матричных принтеров есть режим дампа, когда они вместо текста-графики печатают шестнадцатиричный дамп всего, что им приходит на порт.

Раз это СОМ-порт, то возможно в первых байтах неправильная скорость или порт забит мусором. Еще, как вариант, ты поднимаешь порт, TxD падает из состояния BREAK в низкий уровень, DTR поднимается, что-то еще происходит. Может быть подождать секунду другую, прежде чем посылать текст.

А ты кабель правильно распаял? Сигналы нормальные? А то может быть земли общей нет. Контроль переполнения аппаратный или XON-XOFF? Кабель полностью распаян? Компьютер и принтер оба заземлены? Если заземления нет, то хотя бы соедини их корпуса проводом.

И вообще, забить и отправлять в начале работы 2-3 команды на рестарт принтера. А если у тебя печать какими-то блоками, то отправлять команду на рестарт принтера каждый раз перед печатью блока.

Дак у тебя еще и USB-COM. Купи PCI-адаптер с СОМ-портами.

ansky ★★★★★
()
Последнее исправление: ansky (всего исправлений: 1)
Ответ на: комментарий от ansky

Честно говоря не понял 90% написанного.

Фмскальный принтер ( хз какой он ), команды ходят абсолютно все кроме самой первой. Порт от мусора чищу перед каждой командой, имхо не в нем дело - изначально ответ просто отсутствует. И на аппаратную проблему это тоже не похоже т.к. как уже писал выше решается все одним питоньим скриптом в автозагрузке.

Нашел там

open(«/dev/ttyUSB0», O_RDWR|O_NOCTTY|O_NONBLOCK) = 3

Думаю именно в этом дело.

Когда я посылаю ошибочную команду - принтер при любом раскладе что-нибудь отвечает.

Сам принтер уже работает - чеки печатает, смены открывает / закрывает, ленту режет и т.д., без нареканий.

PCI-адаптер купить не вариант - только USB, требования заказчика :(

Erhaben
() автор топика

А ты случайно не в текстовый стрим пишешь?

anonymous
()

Да, еще. А выходной стрим не буферизован? Может быть, буфер нужно скинуть до первого запроса на ввод.

anonymous
()
Ответ на: комментарий от ansky

Дак у тебя еще и USB-COM. Купи PCI-адаптер с СОМ-портами.

Никаких проблем из USBCOMовости не следует. Подтверждаю на своем опыте.

I-Love-Microsoft ★★★★★
()

Починил? Понятия не имею, как ты делаешь, но я рекомендовал бы проверить «атрибуты терминала». man tcgetattr, tcsetattr

В опциях поставь что-то вроде

options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);

По идее можно сделать из консоли с помощью stty, а потом запустить из неё же прогу.

onanij
()
Ответ на: комментарий от anonymous

Использую жабьи FileInputStream и FileOutputStream. Выходной стрим буферизован, буфер скидываю

Erhaben
() автор топика
Ответ на: комментарий от onanij

Спасибо, попробую. Пока все на том же этапе - питоний скрипт в автозагрузке

Erhaben
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.