Работа с com портами java

Saved searches

Use saved searches to filter your results more quickly

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.

Use serial ports from Java using standard IO methods.

License

rm5248/JavaSerial

This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Sign In Required

Please sign in to use Codespaces.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching Xcode

If nothing happens, download Xcode and try again.

Launching Visual Studio Code

Your codespace will open once ready.

There was a problem preparing your codespace, please try again.

Latest commit

Git stats

Files

Failed to load latest commit information.

README.md

Useful links(note that most of the information within these links is duplicated to a smaller extent within this README):

Simply put, it is a project with the aim of bringing serial port reading/writing into a Java-specific format. This means that we try to follow the Java conventions whenever possible, using InputStream s and OutputStream s to read and write data to the serial port.

How do I use it in a project?

The easiest way is to use Apache Maven, and add it as a dependency:

dependency> groupId>com.rm5248groupId> artifactId>JavaSerialartifactId> version>0.13version> dependency>

However, you may also download the JARs and add them manually to your project if you so desire. The latest versions may be downloaded here. No other dependencies are required.

Once you have added the JAR as a dependency, you may create a new serial port object:

import com.rm5248.serial.NoSuchPortException; import com.rm5248.serial.NotASerialPortException; import com.rm5248.serial.SerialPort; public class SerialTest < public static void main(String[] args) < try < //This would be COM1, COM2, etc on Windows SerialPort s = new SerialPort( "/dev/ttyUSB0" ); > catch (NoSuchPortException e) < System.err.println( "Oh no! That port doesn't exist!" ); > catch (NotASerialPortException e) < System.err.println( "Oh no! That's not a serial port!" ); > catch (IOException e) < System.err.println( "An IOException occured" ); > > >

From here, you can get the InputStream and OutputStream of the object and read/write from the port.
If you don’t need to know about the serial lines at all, open up the serial port like the following:

new SerialPort( "/dev/ttyUSB0", SerialPort.NO_CONTROL_LINE_CHANGE ); 

Otherwise a new thread will be created for each serial port that is opened.

As of version 0.11, you can also use the new SerialPortBuilder class to easily set settings and create a serial port:

import com.rm5248.serial.NoSuchPortException; import com.rm5248.serial.NotASerialPortException; import com.rm5248.serial.SerialPort; import com.rm5248.serial.SerialPortBuilder; public class SerialTest < public static void main(String[] args) < try < SerialPort s = new SerialPortBuilder() .setPort( "/dev/ttyUSB0" ) .setBaudRate( SerialPort.BaudRate.B4800 ) .build(); > catch (NoSuchPortException e) < System.err.println( "Oh no! That port doesn't exist!" ); > catch (NotASerialPortException e) < System.err.println( "Oh no! That's not a serial port!" ); > catch (IOException e) < System.err.println( "An IOException occured" ); > > >

JNI and Environment Variables

All of the JNI code is extracted from the JAR file and loaded at run-time, so there is no fiddling of libraries that has to be done. If you do require special JNI code for some reason, you can set the following environment variables when starting up Java:

com.rm5248.javaserial.lib.path - The directory to look in for the javaserial.[dll|so] com.rm5248.javaserial.lib.name - The name of the library to load(default:javaserial) 

Set them like the following:

java -Dcom.rm5248.javaserial.lib.path=/path/to/javaserial.[dll|so|jnilib] -Dcom.rm5248.javaserial.lib.name=custom-name 

Pre-compiled binaries are provided for:

Why a new serial port library?

First, let’s go through some of the prominent serial port libraries and talk about what I feel their deficiencies are:

  • Java Comm API — The API that most of these libraries use. Predates the Java community process. It’s a stupid API that appears to be designed to mirror how serial ports on Windows work.
  • RXTX — the old guard. Uses the Java Comm API. There are a few forks, but the main branch does not seem to receive updates frequently. The code is very complicated(>25000 lines!). The settings that it opens the serial port with on Linux are not the best for getting raw data.
  • JSSC — Has an API similar to the Java Comm API. Doesn’t provide an easy way of getting raw data from the serial port. The code is relatively small though(
  • PureJavaComm — I haven’t used this in the past, so I can’t comment on it.

All of the above libraries have their own strengths and weaknesses. If they use the Java Comm API, they are hobbled by the fact that it is a poorly designed API compared to the newer Java APIs. It was also made in an era before enums, so it makes improper programming easier. Advantages of JavaSerial:

  • Small code size(~3800 total lines of code, Java/JNI)
  • Auto-extracting JNI code means no worrying about native libraries for each platform.
  • java.io compatible — uses standard InputStream and OutputStream to read/write data
  • Raw serial port settings on Linux to get all the bytes all the time — uses the same settings as GTKTerm
  • Open up any port you want as a serial port — no need to enumerate all ports before opening up a port
  • Enum-based settings allow for clear programming
  • No external dependencies

Disadvantages of JavaSerial:

  • No locking of the serial port — There’s no portable way to do this, so any locking done will be on the Java side. This is a consequence of being rather simple, and as such it not a primary focus of the library.
  • .

About

Use serial ports from Java using standard IO methods.

Источник

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. На этом мы сегодня и остановимся. Всем пока.

Источник

3. Работаем с COM-портом из Java при помощи RXTXcomm «Hello World»

Сегодня многие считают, что COM-порт уже умер, его не увидишь даже на материнских платах современных ПК, не говоря о ноутбуках. И для меня он тоже казался забытым, пока не взялся за программирование микроконтроллеров и, что интересно, почти у всех есть USART-порт и мне в голову пришла мысль подключить его (микроконтроллера) к ПК и передавать ему приветы.

Но, как оказалось, не так уж и просто сделать это из-за того, что ноутбук не имеет COM-порт, а Java знать не знала что это. Первую проблему решил быстро, купил конвертер COM-USB, установил драйвера и заработал. А что касается Java, вот тут стало интереснее. В интернете первое, что нашёл для работы с последовательным портом на Java, был RXTX.

И вот я сделал «Hello World». В данном примере я просто соединил Rx с Tx и отправленные данные приходят тоже мне :).

COM-порт — Пример программы на Java

package com.micro.pi.java.uart; import java.io.IOException; import java.io.InputStream; import java.util.Enumeration; import java.util.TooManyListenersException; import gnu.io.CommPortIdentifier; import gnu.io.PortInUseException; import gnu.io.SerialPort; import gnu.io.SerialPortEvent; import gnu.io.SerialPortEventListener; import gnu.io.UnsupportedCommOperationException; public class JavaRxTx < private static SerialPort serialPort = null; public static void main(String[] args) < // получаем объект типа Enumeration, который содержит объекты типа // CommPortIdentifier для каждого порта в системе. EnumerationportIdentifiers = CommPortIdentifier.getPortIdentifiers(); while (portIdentifiers.hasMoreElements()) < CommPortIdentifier commPortIdentifier = (CommPortIdentifier) portIdentifiers.nextElement(); // Проверяем, есть ли в этом списке последовательные порты if (commPortIdentifier.getPortType() == CommPortIdentifier.PORT_SERIAL) < System.out.println("Com port : " + commPortIdentifier.getName()); try < // Открываем порт serialPort = (SerialPort) commPortIdentifier.open(JavaRxTx.class.getName(), 2000); // Выставляем параметры serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_2, SerialPort.PARITY_NONE); // Выключаем аппаратное управление потоком serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_NONE); // Включаем уведомления, когда входные данные доступны serialPort.notifyOnDataAvailable(true); // Включаем SerialPortEventListener serialPort.addEventListener(new SerialPortEventListener() < @Override 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: InputStream inputStream; byte[] buffer; try < inputStream = serialPort.getInputStream(); buffer = new byte[1024]; int bytes = 0; while ((bytes = inputStream.read(buffer)) >0) < System.out.print(new String(buffer, 0, bytes)); >> catch (IOException e) < e.printStackTrace(); >break; > > >); > catch (PortInUseException | UnsupportedCommOperationException | TooManyListenersException e) < e.printStackTrace(); >// Выходим из цикла потому, что мы использовали первый // попавшийся последовательный порт break; > > if (serialPort != null) < String message = "Hello world!!11"; try < // Передаём привет serialPort.getOutputStream().write(message.getBytes()); // Ждём немножко Thread.sleep(100); // Удаляем EventListener serialPort.removeEventListener(); // Закрываем порт serialPort.close(); >catch (Exception e) < e.printStackTrace(); >> else < System.out.println("Serial port object is null"); >> >

Результат

Stable Library ========================================= Native lib Version = RXTX-2.1-7 Java lib Version = RXTX-2.1-7 Com port : COM8 Hello world!!11

Официальный сайт RXTX и страница где всё это можно скачать.

Источник

Читайте также:  Закрепить меню в html
Оцените статью