忘備録-備忘録

技術的な備忘録

javaでシリアル通信

2018-11-15 20:29:00 | raspberry ...

ライブラリをインストールします。

$ sudo apt-get install librxtx-java

サンプルコードを入力します。(ARMアーキテクチャ環境のJava7でRXTXをビルドするのページより)

//http://d.hatena.ne.jp/talisker_ZQN/20130508/1368017726
import gnu.io.CommPortIdentifier;
import java.util.Enumeration;

public class Test{
  public static void main(String[] args){
    System.out.println("main method start.");
    try{
      Enumeration portList = CommPortIdentifier.getPortIdentifiers();
      CommPortIdentifier port = null;
      while (portList.hasMoreElements()) {
        port = (CommPortIdentifier)portList.nextElement();
        System.out.println(port.getName());
      }
    }catch(Exception e){
      e.printStackTrace();
    }
  }
}

コンパイル&実行します。

コンパイル

$ javac -cp .:/usr/share/java/RXTXcomm.jar Test.java

実行 シリアルポートの一覧が表示される

$ java -cp .:/usr/share/java/RXTXcomm.jar -Djava.library.path=/usr/lib/jni Test


Javaからシリアル(RS232C)通信をするのページ
にサンプルプログラムが存在するので動作チェックすることができます。

//http://ytkoks.github.io/programming/2012/08/31/serial-communications-with-java/
import java.io.*;
import java.util.*;
import gnu.io.*;

public class serial implements SerialPortEventListener {
    private SerialPort port;
    private static BufferedReader reader;

    serial() {
        try {
            // Serial port initialize
            CommPortIdentifier portId = CommPortIdentifier.getPortIdentifier("/dev/ttyS0");
            port = (SerialPort)portId.open("serial", 2000);

            port.setSerialPortParams(
                9600,                   // 通信速度[bps]
                SerialPort.DATABITS_8,   // データビット数
                SerialPort.STOPBITS_1,   // ストップビット
                SerialPort.PARITY_NONE   // パリティ
            );
            port.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);

            reader = new BufferedReader(
                     new InputStreamReader(port.getInputStream()));

            try {
                port.addEventListener(this);
                port.notifyOnDataAvailable(true);
            } catch (TooManyListenersException e) {
                System.out.println("Error: " + e);
            }

        } catch (Exception e) {
            System.out.println("Error: " + e);
            System.exit(1);
        }
    }

    public void run() {
        try {
            InputStreamReader isr = new InputStreamReader(System.in);
            BufferedReader br = new BufferedReader(isr);
            OutputStream out = port.getOutputStream();
            boolean flagQuit = false;
            while (!flagQuit) {
                String input = br.readLine();
                if (input.length() > 0) {
                    if (input.equals(":quit"))
                        break;
                    input += "\r";
                    out.write(input.getBytes("US-ASCII"));
                }

            }

            port.close();

        } catch (Exception e) {
            System.out.println("Error: " + e);
        }
    }

    public void serialEvent(SerialPortEvent event) {
        if (event.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
            String buffer = null;
            try {
                while (reader.ready()) {
                    buffer = reader.readLine();
                    System.out.println(buffer);
                }
            } catch (IOException ex){
                ex.printStackTrace();
                System.exit(1);
            }
        }
    }

    public static void main(String arg[]) {
        serial serial = new serial();
        serial.run();
    }
}

 

参考