Pull to refresh

Работаем с COM-портом из Java при помощи jSSC

Reading time4 min
Views78K
Уж много воды утекло с тех пор, как мы пользовались мышами на com-у, модемами, играли «по нему» в игры за неимением сети, перекидывали файлики и …, чего только мы с ним не делали.

Всё, на дворе 21 век, USB 3.0 подмял по себя всё и вся, com-ы вымерли и теперь «новорожденные» программисты смотрят на этот разъём с недоумением и укоризной. Но, умерли не все, кое-кто всё-таки остался… Эти бравые парни шлют байты по трём проводам и с со снисходительной улыбкой смотрят на «новорожденных». И о том, чем эти парни пользуются выполняя свою работу я и хочу поведать в этой небольшой статье. Речь в ней пойдёт о маленькой библиотечке по имени jSSC.

Судя по тому, как люди на Хабре отзываются о com-е видимо многие действительно считают что он уже не нужен и не понимают зачем кто-то до сих пор его использует, зачем пишут библиотеки и софт, производят оборудование с этим портом на борту. От себя могу сказать лишь одно, дабы не разводить холивар, как мне кажется, он пропал лишь для домашнего использования, а на производствах и в различных лабораториях он есть и чувствует себя просто отлично. На то есть много причин, но основная как мне кажется это простота и удобство в работе.

Но разговор сейчас не о том, так что не будем отвлекаться. Итак, jSSC это Java библиотека для простой работы с COM-портом (Java Simple Serial Connector). Своё официальное, публичное начало она берёт в 2010 году. Именно тогда было решено поделиться ей с разработчиками на Java (распространяется под лицензией LGPL). К написанию библиотеки привёл печальный факт – отсутствие адекватных инструментов для работы с этим портом. Многие скажут, и уже говорили, мол есть javax.comm, rxtx ну и ещё есть giovynet (но его нельзя серьёзно рассматривать ни при каких обстоятельствах), но к сожалению не всё так просто. Нашей основной ОС является Windows, и использовать javax.comm 3.0 не получится, rxtx-же не подошёл из-за своей нестабильности. В результате делать было нечего, пришлось писать свою библиотеку.

Во главу угла при разработке была поставлена простота использования, ведь каждый день приходится работать с оборудованием, и хочется, чтобы работа доставляла удовольствие. Но пусть это вас не вводит в заблуждение, простота это не серебряная пуля и не кнопка «сделать пи*дато», нужно понимать чего вы хотите получить от устройства, как оно работает и как вообще происходит взаимодействие устройств по com-у. При разработке больший уклон был сделан в сторону Windows стиля разработки под com-порт, в основном это выражается в именовании констант для установки маски ивентов, режима управления потоком, разбора ошибок и т.д.

jSSC можно разделить на несколько основных частей:
  • SerialNativeInterface – класс, который предоставляет доступ ко всем «нативным» методам jSSC.
  • SerialPort – класс, с помощью которого мы уже будем непосредственно работать с нужным нам портом.
  • SerialPortEventListener – интерфейс, который необходимо реализовать, если мы хотим использовать ивенты.

Теперь можно набросать небольшой пример. Предположим, что у нас есть какой-то прибор, который использует аппаратное управление потоком, и мы хотим получать от него ответы на запросы. Вот пример реализации:

import jssc.SerialPort;
import jssc.SerialPortEvent;
import jssc.SerialPortEventListener;
import jssc.SerialPortException;

public class Test {

    private static SerialPort serialPort;

    public static void main(String[] args) {
        //Передаём в конструктор имя порта
        serialPort = new SerialPort("COM1");
        try {
            //Открываем порт
            serialPort.openPort();
            //Выставляем параметры
            serialPort.setParams(SerialPort.BAUDRATE_9600,
                                 SerialPort.DATABITS_8,
                                 SerialPort.STOPBITS_1,
                                 SerialPort.PARITY_NONE);
            //Включаем аппаратное управление потоком
            serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_RTSCTS_IN | 
                                          SerialPort.FLOWCONTROL_RTSCTS_OUT);
            //Устанавливаем ивент лисенер и маску
            serialPort.addEventListener(new PortReader(), SerialPort.MASK_RXCHAR);
            //Отправляем запрос устройству
            serialPort.writeString("Get data");
        }
        catch (SerialPortException ex) {
            System.out.println(ex);
        }
    }

    private static class PortReader implements SerialPortEventListener {

        public void serialEvent(SerialPortEvent event) {
            if(event.isRXCHAR() && event.getEventValue() > 0){
                try {
                    //Получаем ответ от устройства, обрабатываем данные и т.д.
                    String data = serialPort.readString(event.getEventValue());
                    //И снова отправляем запрос
                    serialPort.writeString("Get data");
                }
                catch (SerialPortException ex) {
                    System.out.println(ex);
                }
            }
        }
    }
}


По-моему всё довольно просто. Помимо операций чтения/записи jSSC предоставляет следующий ряд возможностей:
  • Управление линиями RTS, DTR
  • Получение статуса линий CTS, DSR, RING, RLSD
  • Получение количества байт в буферах
  • Очистка буферов порта
  • Отправка сигнала Break
  • Управление потоком
  • Получение списка com-портов в системе

Здесь стоит отметить один важный момент: адаптеры USB->COM могут иногда вести себя не так, как вы того ожидаете, это понятное дело зависит от их драйвера, так что если вы собираетесь использовать такие адаптеры хорошенько протестируйте их работу в Linux и Windows, если конечно вам нужна поддержка разных ОС.

Спустя год после публикации jSSC было немало писем от разработчиков и фирм, и область применения оказалась довольно обширна. Вот небольшой список:
  • Irda управление для HTPC (проект одной фирмы из США)
  • Тюнинг Mitsubishi Eclipse (привет туда же – в США)
  • Серверное ПО в центре сетевых технологий (Польша)
  • Система взвешивания посылок (на сколько я понял) для какой-то службы доставки (для этих ребят я писал мостик из Java в JavaScript и они вознаградили мои труды прислав 100 USD, кстати тоже США)
  • Различные учебные проекты (Индия, Россия и может быть ещё кто-то)
  • и т.д.

Ну и отдельный привет передаю ребятам из Индии, для которых делал версию jSSC-CE (Windows CE). Если мне не изменяет память они заказали какое-то оборудование на WinCE не проверив а есть-ли под неё JVM от SUN/Oracle, и были очень удивлены когда узнали что её нет. Я для разработки использовал тогда CreMe JVM, ну надеюсь что у них всё получилось.

Ну что же, разрешите откланяться, прошу прощения за немного сумбурное повествование, и надеюсь, что кому-то из вас jSSC поможет в работе. Буду рад ответить на ваши вопросы.

А вот и ссылка на страницу проекта: http://code.google.com/p/java-simple-serial-connector
Tags:
Hubs:
+32
Comments16

Articles