Read com port java

Programming Tutorials

By: Steven Lim in Java Tutorials on 2006-12-11 Most projects that deal with hardware and devices, needs to communicate with them using the COM port of the PC or Server. For example if there is a modem that is connected to a server via its COM port and the Java program has to read the output of the modem then the Java program has to read the COM port for any incoming data. This sample Java program can be used to Read from a COM port for incoming data and process it. Note that you will need to change the Port number to COM1 or COM2 or any other ports as required. Also if you are using unix based machines then you will have to uncomment the /dev/term/a instead of COM.

import java.io.*; import java.util.*; import javax.comm.*; public class SimpleRead implements Runnable, SerialPortEventListener < static CommPortIdentifier portId; static Enumeration portList; InputStream inputStream; SerialPort serialPort; Thread readThread; public static void main(String[] args) < portList = CommPortIdentifier.getPortIdentifiers(); while (portList.hasMoreElements()) < portId = (CommPortIdentifier) portList.nextElement(); if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) < if (portId.getName().equals("COM1")) < // if (portId.getName().equals("/dev/term/a")) < SimpleRead reader = new SimpleRead(); >> > > public SimpleRead() < try < serialPort = (SerialPort) portId.open("SimpleReadApp", 2000); >catch (PortInUseException e) try < inputStream = serialPort.getInputStream(); >catch (IOException e) try < serialPort.addEventListener(this); >catch (TooManyListenersException e) serialPort.notifyOnDataAvailable(true); try < serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); >catch (UnsupportedCommOperationException e) readThread = new Thread(this); readThread.start(); > public void run() < try < Thread.sleep(20000); >catch (InterruptedException e) > public void serialEvent(SerialPortEvent event) < switch(event.getEventType()) < case SerialPortEvent.BI: case SerialPortEvent.OE: case SerialPortEvent.FE: case SerialPortEvent.PE: case SerialPortEvent.CD: case SerialPortEvent.CTS: case SerialPortEvent.DSR: case SerialPortEvent.RI: case SerialPortEvent.OUTPUT_BUFFER_EMPTY: break; case SerialPortEvent.DATA_AVAILABLE: byte[] readBuffer = new byte[20]; try < while (inputStream.available() >0) < int numBytes = inputStream.read(readBuffer); >System.out.print(new String(readBuffer)); > catch (IOException e) break; > > >

Источник

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

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

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

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

Читайте также:  Https peterburg center ln byudzhetnye kempingi vokrug sankt peterburga html

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

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

  • 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); >> > > >
  • Управление линиями RTS, DTR
  • Получение статуса линий CTS, DSR, RING, RLSD
  • Получение количества байт в буферах
  • Очистка буферов порта
  • Отправка сигнала Break
  • Управление потоком
  • Получение списка com-портов в системе
  • Irda управление для HTPC (проект одной фирмы из США)
  • Тюнинг Mitsubishi Eclipse (привет туда же – в США)
  • Серверное ПО в центре сетевых технологий (Польша)
  • Система взвешивания посылок (на сколько я понял) для какой-то службы доставки (для этих ребят я писал мостик из Java в JavaScript и они вознаградили мои труды прислав 100 USD, кстати тоже США)
  • Различные учебные проекты (Индия, Россия и может быть ещё кто-то)
  • и т.д.

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

Источник

Читайте также:  Php код переход страницу

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 (обведенно красным). Теперь дополняем выше приведенный код, созданием окна, кнопки и текстового поля. Т.е. используем программу из предыдущей статьи. На рисунке ниже также вывод данных на консоль и в оконное приложение, а именно в текстовое поле метки. Здесь небольшая не доработка, где видно, что данные выводятся не на полную ширину поля, но самое главное мы добились поставленной цели, а именно чтение данных.

Читайте также:  Python many to many query

Исходник оконного приложения, с чтением данных из порта по нажатию на кнопку и вывод в текстовое поле.

В следующей статье мы с вами рассмотрим как сохранять информацию в текстовый файл, откуда потом сохраним ее в базу данных.

В качестве примера взаимодействия БД и приложения смотри SQLite JDBC for JavaFX . Скрин ниже.

Критика и дополнения приветствуются. Данная программа не претендует на «эталон качества». Здесь главной целью, как и всего проекта блога, является первые шаги в прикладном программировании в данном случае уже на Java. На этом мы сегодня и остановимся. Всем пока.

Источник

Read and Write to Serial Port Using JSSC Library in Java

JSSC (Java Simple Serial Connector) is a lightweight Java library which built to write and read data from Serial Ports from a Java Application. For this tutorial we have used the latest version 2.9.2 of the JSSC library which we can get to date.

This code line initializing the COM port

serialPort = new SerialPort("COM1"); 

This line is opening the COM Port connection

Below code is setting the parameters for serial access.

 serialPort.setParams(SerialPort.BAUDRATE_9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);

Below code managing the rate of data transmission via flow-control

serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_RTSCTS_IN | SerialPort.FLOWCONTROL_RTSCTS_OUT);

Once the application opened the port to receive data we can implement a listener for that. For this we are using an event reader as below

serialPort.addEventListener(new PortReader(), SerialPort.MASK_RXCHAR);

Same as reading data from serial port we can send data to the COM Port using below code lines

 String s = "Hello World \n"; serialPort.writeString(s);

Below is the event listener for the COM Port and once a data revised to the Serial Port this event listener will trigger.

private class PortReader implements SerialPortEventListener < @Override public void serialEvent(SerialPortEvent event) < if (event.isRXCHAR() && event.getEventValue() >0) < try < String receivedData = serialPort.readString(event.getEventValue()); System.out.println("Recvied Data : " + receivedData); >catch (SerialPortException ex) < System.out.println("Error in receiving response from port: " + ex); >> > >

You can refer the full source code as below. You can use the same class to read/write to concurrent COM ports as well.

/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package serialreader; import jssc.*; /** * * @author Sithara */ public class SerialDataReceiver implements Runnable < private SerialPort serialPort; private void initCOMPort() < 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); String s = "Hello World \n"; serialPort.writeString(s); >catch (SerialPortException ex) < System.out.println("Error in writing data to port: " + ex); >> @Override public void run() < initCOMPort(); >private class PortReader implements SerialPortEventListener < @Override public void serialEvent(SerialPortEvent event) < if (event.isRXCHAR() && event.getEventValue() >0) < try < String receivedData = serialPort.readString(event.getEventValue()); System.out.println("Recvied Data : " + receivedData); >catch (SerialPortException ex) < System.out.println("Error in receiving response from port: " + ex); >> > > > 

Источник

Оцените статью