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

Как передать данные через 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

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

Похожие записи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *