Java rxtx code to connect to rfcomm0 is not workin

2019-08-14 13:59发布

问题:

I have successfully connected my arduino uno R3 with bluetooth mate module and am able to send data to my laptop running Ubuntu 12.04 via bluetooth. (using serial port protocol). The data is received on rfcomm0.

The following code displays the received data : sudo screen /dev/rfcomm0

Now I am facing problems in reading this data in a java program. I have referred the code from http://playground.arduino.cc/Interfacing/Java. This uses the rxtx library to access the serial port.

Here is the code :

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import gnu.io.CommPortIdentifier; 
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent; 
import gnu.io.SerialPortEventListener; 
import java.util.Enumeration;


public class SerialTest implements SerialPortEventListener {
    SerialPort serialPort;
    /** The port we're normally going to use. */
    private static final String PORT_NAMES[] = { 
            "/dev/tty.usbserial-A9007UX1", // Mac OS X
            "/dev/ttyUSB0", // Linux
            "COM3", // Windows
//          "/dev/ttyACM0" // Ubuntu
            "/dev/rfcomm0" // Ubuntu Bluetooth
    };
    /**
    * A BufferedReader which will be fed by a InputStreamReader 
    * converting the bytes into characters 
    * making the displayed results codepage independent
    */
    private BufferedReader input;
    /** The output stream to the port */
    private OutputStream output;
    /** Milliseconds to block while waiting for port open */
    private static final int TIME_OUT = 2000;
    /** Default bits per second for COM port. */
    private static final int DATA_RATE = 9600;

    public void initialize() {
        CommPortIdentifier portId = null;
        Enumeration portEnum = CommPortIdentifier.getPortIdentifiers();

        //First, Find an instance of serial port as set in PORT_NAMES.
        while (portEnum.hasMoreElements()) {
            CommPortIdentifier currPortId = (CommPortIdentifier) portEnum.nextElement();
            for (String portName : PORT_NAMES) {
                if (currPortId.getName().equals(portName)) {
                    portId = currPortId;
                    break;
                }
            }
        }
        if (portId == null) {
            System.out.println("Could not find COM port.");
            return;
        }

        try {
            // open serial port, and use class name for the appName.
            serialPort = (SerialPort) portId.open(this.getClass().getName(),
                    TIME_OUT);

            // set port parameters
            serialPort.setSerialPortParams(DATA_RATE,
                    SerialPort.DATABITS_8,
                    SerialPort.STOPBITS_1,
                    SerialPort.PARITY_NONE);

            // open the streams
            input = new BufferedReader(new InputStreamReader(serialPort.getInputStream()));
            output = serialPort.getOutputStream();

            // add event listeners
            serialPort.addEventListener(this);
            serialPort.notifyOnDataAvailable(true);
        } catch (Exception e) {
            System.err.println(e.toString());
        }
    }

    /**
     * This should be called when you stop using the port.
     * This will prevent port locking on platforms like Linux.
     */
    public synchronized void close() {
        if (serialPort != null) {
            serialPort.removeEventListener();
            serialPort.close();
        }
    }

    /**
     * Handle an event on the serial port. Read the data and print it.
     */
    public synchronized void serialEvent(SerialPortEvent oEvent) {
        if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
            try {
                String inputLine=input.readLine();
                System.out.println(inputLine);
            } catch (Exception e) {
                System.err.println(e.toString());
            }
        }
        // Ignore all the other eventTypes, but you should consider the other ones.
    }

    public static void main(String[] args) throws Exception {
        SerialTest main = new SerialTest();
        main.initialize();
        Thread t=new Thread() {
            public void run() {
                //the following line will keep this app alive for 10 seconds,
                //waiting for events to occur and responding to them (printing incoming messages to console).
                try {Thread.sleep(10000);} catch (InterruptedException ie) {}
            }
        };
        System.out.println("Started");
        t.start();
        t.join();
        main.close();
        System.out.println("Stopped");
    }
}

This program compiles seccessfully but when executes displays : "Could not find COM port."

Note : This code works perfectly when reading data from usb port /dev/ttyACM0. The problem arises when i try to read data from bluetooth port /dev/rfcomm0.

So basically I need a java program to read from rfcomm0 port. Any help is greatly appreciated.

回答1:

Thanks to @angelatlarge for his suggestion.

The problem was that the java program did not have the permission to access /dev/rfcomm0.

Command to provide permission : sudo chmod a+rw /dev/rfcomm0

So giving the permission to /dev/rfcomm0 solved the problem for me. Now the java program can read the data from the rfcomm0 port.