Уж много воды утекло с тех пор, как мы пользовались мышами на 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 можно разделить на несколько основных частей:
Теперь можно набросать небольшой пример. Предположим, что у нас есть какой-то прибор, который использует аппаратное управление потоком, и мы хотим получать от него ответы на запросы. Вот пример реализации:
По-моему всё довольно просто. Помимо операций чтения/записи jSSC предоставляет следующий ряд возможностей:
Здесь стоит отметить один важный момент: адаптеры USB->COM могут иногда вести себя не так, как вы того ожидаете, это понятное дело зависит от их драйвера, так что если вы собираетесь использовать такие адаптеры хорошенько протестируйте их работу в Linux и Windows, если конечно вам нужна поддержка разных ОС.
Спустя год после публикации jSSC было немало писем от разработчиков и фирм, и область применения оказалась довольно обширна. Вот небольшой список:
Ну и отдельный привет передаю ребятам из Индии, для которых делал версию jSSC-CE (Windows CE). Если мне не изменяет память они заказали какое-то оборудование на WinCE не проверив а есть-ли под неё JVM от SUN/Oracle, и были очень удивлены когда узнали что её нет. Я для разработки использовал тогда CreMe JVM, ну надеюсь что у них всё получилось.
Ну что же, разрешите откланяться, прошу прощения за немного сумбурное повествование, и надеюсь, что кому-то из вас jSSC поможет в работе. Буду рад ответить на ваши вопросы.
А вот и ссылка на страницу проекта: http://code.google.com/p/java-simple-serial-connector
Всё, на дворе 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