COM-порт. Опрос и вывод данных на JAVA. Шаг №46
Всем привет. Итак как Вы помните в предыдущей статье мы разобрали создание простого оконного приложения на Java, а именно окно, кнопку и текстовое поле. В этой статье мы научимся мониторить (слушать) COM-порт (последовательный или RS-232), встроим код в предыдущую программу (прошлой статьи) и выведем данные контроллера сбора данных уже в нашу программу: (как в статье №42, только на терминал) в текстовое поле оконного приложения по нажатию на кнопку.
Для работы с COM-портом существуют такие библиотеки, как javax.com, rxtx, giovynet, jssc. Я использовал последнюю. Итак что же такое JSSC (Java Simple serial Connector) – Java библиотека для простой работы с COM-портом, которая распространяется с 2010 года под лицензией LGPL. Библиотека скачивается архивным файлом расширением.jar и содержит в себе 7- классов, динамическую библиотеку под операционную систему. Для запуска, библиотеку необходимо подключить в Eclipse следующим образом: в меню Eclipse -> выбираем вкладку Project –> Properties –> Java Build Path –> Add External JARs –> jssc.jar. Так при неправильно подключенной библиотеки очень часто происходит похожая ошибка:
Exception in thread «main» java.lang.UnsatisfiedLinkError: jssc.SerialNativeInterface.getSerialPortNames ()
Что говорит о том что не работает метод OpenPort. На рисунке ниже у нас положительный результат подключения библиотеки JSSC, в проводнике проекта, слева, а также результат небольшой программы по получению списка портов программы в виде массива строк методом getPortNames () класса SerialPortList. Данная библиотека не ведет опрос всех подряд портов, а берет данные из реестра
Если программа запускается из консоли, то необходимо перейти в директорию с программой и оттуда непосредственно производить запуск – jar jssc – файл.java. Либо библиотеку положить в директорию bin Java –машины.
Далее приведен код чтения данных из порта на java:
import jssc.SerialPort; /*Импорт классов библиотеки jssc*/
import jssc.SerialPortEvent;
import jssc.SerialPortEventListener;
import jssc.SerialPortException;
public class readLog < /*Класс чтения из порта*/
private static SerialPort serialPort; /*Создаем объект типа SerialPort*/
public static void main (String[] args) < /* Точка входа в программу*/
serialPort = new SerialPort («COM3»); /*Передаем в конструктор суперкласса имя порта с которым будем работать*/
try <
serialPort.openPort (); /*Метод открытия порта*/
serialPort.setParams (SerialPort.BAUDRATE_9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); /*Задаем основные параметры протокола UART*/
serialPort.setEventsMask (SerialPort.MASK_RXCHAR); /*Устанавливаем маску или список события на которые будет происходить реакция. В данном случае это приход данных в буффер порта*/
serialPort.addEventListener (new EventListener ()); /*Передаем экземпляр класса EventListener порту, где будет обрабатываться события. Ниже описан класс*/
>
catch (SerialPortException ex) <
System.out.println (ex);
>
>
private static class EventListener implements SerialPortEventListener < /*Слушатель срабатывающий по появлению данных на COM-порт */
public void serialEvent (SerialPortEvent event) <
if (event.isRXCHAR () && event.getEventValue () > 0) < /*Если происходит событие установленной маски и количество байтов в буфере более 0*/
try <
String data = serialPort.readString (event.getEventValue ()); /*Создаем строковую переменную data, куда и сохраняем данные*/
System.out.print (data); /*Выводим данные на консоль*/
>
catch (SerialPortException ex) <
System.out.println (ex);
>
>
>
>
>
На рисунке ниже результат вывода данных с порта на консоль Eclipse (обведенно красным). Теперь дополняем выше приведенный код, созданием окна, кнопки и текстового поля. Т.е. используем программу из предыдущей статьи. На рисунке ниже также вывод данных на консоль и в оконное приложение, а именно в текстовое поле метки. Здесь небольшая не доработка, где видно, что данные выводятся не на полную ширину поля, но самое главное мы добились поставленной цели, а именно чтение данных.
Исходник оконного приложения, с чтением данных из порта по нажатию на кнопку и вывод в текстовое поле.
В следующей статье мы с вами рассмотрим как сохранять информацию в текстовый файл, откуда потом сохраним ее в базу данных.
В качестве примера взаимодействия БД и приложения смотри SQLite JDBC for JavaFX . Скрин ниже.
Критика и дополнения приветствуются. Данная программа не претендует на «эталон качества». Здесь главной целью, как и всего проекта блога, является первые шаги в прикладном программировании в данном случае уже на Java. На этом мы сегодня и остановимся. Всем пока.
Java Serial Ports
Java Serial Ports are used for serial communication with windows applications. Many options are available to work with serial ports, but most are out of date.
Even the Java API javax.comm is deprecated in new versions. This tutorial demonstrates how to work with serial ports in Java.
Java Serial Ports Using JSerialComm API
JSerialComm is a Java library, which provides a platform-independent way to use serial ports, and we don’t require external libraries. The JSerialComm is the best alternative to outdated RxTx and deprecated javax.comm libraries.
JSerialComm is easy to use and has enhanced timeouts support. It also supports opening multiple ports simultaneously.
Follow the steps to use the serial ports in Java.
Add the jar file to your build path, and then you are ready to use JSerialComm .
Let’s try a simple example to print the serial ports on our device. It should be mentioned here that if your device doesn’t have ports, the code will not print any port.
package delftstack; import com.fazecast.jSerialComm.SerialPort; public class Serial_Port public static void main(String[] args) System.out.println("Hello this is a java program to check ports from delftstack"); SerialPort[] Device_Ports = SerialPort.getCommPorts(); for (SerialPort each_port: Device_Ports) System.out.println(each_port.getSystemPortName()); > > >
It doesn’t show any ports for our system because it doesn’t have any ports, shown from the output and the device manager screenshot.
Hello this is a java program to check ports from delftstack
This link also provides a Java project in a zip file that can be imported. This project has a test program that shows almost all the operations of serial ports.
Sheeraz is a Doctorate fellow in Computer Science at Northwestern Polytechnical University, Xian, China. He has 7 years of Software Development experience in AI, Web, Database, and Desktop technologies. He writes tutorials in Java, PHP, Python, GoLang, R, etc., to help beginners learn the field of Computer Science.