Как передать данные через COM-порт в Java
Сегодня многие считают, что COM-порт уже умер, его не увидишь даже на материнских платах современных ПК, не говоря о ноутбуках. И для меня он тоже казался забытым, пока не взялся за программирование микроконтроллеров и, что интересно, почти у всех есть USART-порт и мне в голову пришла мысль подключить его (микроконтроллера) к ПК и передавать ему приветы.
Но, как оказалось, не так уж и просто сделать это из-за того, что ноутбук не имеет COM-порт, а Java знать не знала что это. Первую проблему решил быстро, купил конвертер COM-USB, установил драйвера и заработал. А что касается Java, вот тут стало интереснее. В интернете первое, что нашёл для работы с последовательным портом на Java, был RXTX.
Смотрите ещё:
Установка Rx Tx библиотек (Windows)
Установка JDK и Eclipse
И вот я сделал «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 для каждого порта в системе.
Enumeration<?> portIdentifiers = 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