Тема COM порта в асинхронном режиме уже подымалась на нашем ресурсе. Данный пост это продолжение поднятой темы только с применением технологии Java. Итак, чем примечателен асинхронный режим работы COM порта? Прежде всего тем, что позволяет вести прием непрерывного пакета байт с переменной длиной или проще говоря принимать в каждый цикл приема различное, заранее неизвестное количество байт.
И тем не менее для надежного прима информационного пакета в каждый отдельный цикл прима, передающая сторона должна передавать в начале пакета синхросимволы с последующим указанием, например в двух байтах, длины в байтах всего пакета. Обычно для этих целей применяется последовательность синхросимволов, например 0xA1 0xa2 или 0x55 0xaa или 0xFF, 0xFF, 0xFF, 0xFF, 0xFF. Такой простейший прием дает возможность надежной прграммной синхронизации начала приема, а наличие в принимаемом пакете, данных о его длине, возможность формирования программного флага конца приема.
В предыдущем посте для загрузки в программный буфер всего информационного пакета предлагался вариант с таймаутом устанавливаемым в обработчике события появления данных в приемном буфере COM порта и формированием ответного пакета после окончания таймаута. Но если, допустим, необходимо сформировать ответ сразу после окончания прима, то такой вариант не подойдет. Для организация алгоритма обмена типа пинг-понг можно воспользоваться синхросимволами начала принимаемого пакета и данными об общем количестве байт принимаемой информации. В этом случае информацию в программный буфер из буфера COM порта можно перегружать порциями при каждом входе в обработчик события появления данных в приемном буфере порта.
Поскольку при каждом входе в обработчик имеется точная информация о количестве байт в приемном буфере COM порта, то с помощью программного счетчика можно подсчитывать общее количество байт накапливаемой информации в программном буфере и формировать флаг окончания прима. По флагу окончания приема можно выполнять отправку ответного пакета. Такой вариант обмена информацией не требует таймаута и работает по принципу пинг-понг, что во многих случаях является самым оптимальным.
По такому принципу и построено тестовое десктопное приложение на Java. Приложение принимает COM пакет переменной длины до 4000 байт и отображает его в HEX виде в окне приема. Скорость 115200 бод. По умолчанию в приложении установлен порт COM1. Для тестирования приложения используется такой-же вариант как и в предыдущем посте — применение известной программы-монитора COM порта COM Port Toolkit.
Java довольно специфический язык программирования. В нем широко используется принцип ООП и программирование имеет свои особенности непохожие ни на какой другой язык программирования. Если еще совсем недавно десктопные приложения на Java нельзя было сравнивать с десктопными приложениями на C++ ни по скорости ни по функциональности, то на сегодняшний день все практически выровнялось.
Ниже приведен код приложения для асинхронного приема по COM порту на Java. А в конце поста собственно архив проекта для Net Beans 7.2.
Как передать данные через COM-порт в Java
Сегодня многие считают, что COM-порт уже умер, его не увидишь даже на материнских платах современных ПК, не говоря о ноутбуках. И для меня он тоже казался забытым, пока не взялся за программирование микроконтроллеров и, что интересно, почти у всех есть USART-порт и мне в голову пришла мысль подключить его (микроконтроллера) к ПК и передавать ему приветы.
Но, как оказалось, не так уж и просто сделать это из-за того, что ноутбук не имеет COM-порт, а Java знать не знала что это. Первую проблему решил быстро, купил конвертер COM-USB, установил драйвера и заработал. А что касается Java, вот тут стало интереснее. В интернете первое, что нашёл для работы с последовательным портом на Java, был RXTX.
И вот я сделал «Hello World». В данном примере я просто соединил Rx с Tx и отправленные данные приходят тоже мне :).
jSSC (Java Simple Serial Connector) — библиотека для работы с последовательными (COM) портами ПК. Библиотека создавалась как простая и надёжная замена уже имеющимся средствам. Своё официальное, публичное начало она берёт в 2010 году и распространяется под лицензией LGPL.
С помощью jSSC можно получать имена портов, читать и писать данные, получать ивенты о произошедших событиях ну и т.д. В отличии от javax.comm, с jSSC можно управлять линиями RTS и DTR. Библиотека разрабатывалась для работы в режиме 24/7 в многопоточных системах и на данный момент успешно используется в системах автоматизации, сбора и регистрации данных.
Библиотеку можно использовать на таких платформах, как:
- Windows x86 и x64;
- Linux x86, x64, armhf и armsf (т.е. Raspberry Pi, Orange Pi, Banana Pi, NanoPi и тп);
- Solaris x86 и x64;
- Mac OS X ppc, ppc64, x86 и x64.
jSSC можно разделить на несколько основных частей:
- SerialNativeInterface – класс, который предоставляет доступ ко всем «нативным» методам jSSC.
- SerialPort – класс, с помощью которого мы уже будем непосредственно работать с нужным нам портом.
- SerialPortEventListener – интерфейс, который необходимо реализовать, если мы хотим использовать ивенты.
jSSC предоставляет следующий ряд возможностей:
- Чтение и запись данных;
- Управление линиями RTS, DTR;
- Получение статуса линий CTS, DSR, RING, RLSD;
- Получение количества байт в буферах;
- Очистка буферов порта;
- Отправка сигнала Break;
- Управление потоком;
- Получение списка com-портов в системе;
Источник: