I am trying to use the RXTX library to block serial communication on Windows (XP and 7). I tested the connection to Hyperterminal at both ends and it works flawlessly.
I established a connection with the following code: (exception handling and security checks omitted for clarity)
private InputStream inStream; private OutputStream outStream; private BufferedReader inReader; private PrintWriter outWriter; private SerialPort serialPort; private final String serialPortName; public StreamComSerial(String serialPortName) { this.serialPortName = serialPortName; CommPortIdentifier portIdentifier; portIdentifier = CommPortIdentifier.getPortIdentifier(serialPortName); CommPort commPort = null; commPort = portIdentifier.open(this.getClass().getName(),500); serialPort = (SerialPort) commPort; serialPort.setSerialPortParams(4800,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE); inStream = serialPort.getInputStream(); outStream = serialPort.getOutputStream(); inReader = new BufferedReader(new InputStreamReader(inStream, Settings.getCharset())); outWriter = new PrintWriter(new OutputStreamWriter(outStream, Settings.getCharset()));
When i use
outWriter.println("test message"); flush();
the message receives a penalty at the other end, but causes
inReader.readLine()
imidiately returns "java.io.IOException: the underlying input stream returns null bytes".
Then I decided to try and implement my own lock reading logic and wrote the following:
public String readLine() throws IOException { String line = new String(); byte[] nextByte = {-1}; while (true) { nextByte[0] = (byte)inStream.read(); logger.debug("int read: " + nextByte[0]); if (nextByte[0] == (byte)-1) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } continue; } logger.debug("byte read: " + nextByte[0]); line = line + new String(nextByte); if (nextByte[0] == (byte)13) {
But this code goes in an infinite loop and "nextByte [0] = (byte) inStream.read ();" assigns -1 regardless of what is sent over the serial connection. In addition, the other end stutters rather badly and only allows me to send a character every 1-3 seconds. and hangs for a long time if I try to send several characters in a short packet.
Any help is greatly appreciated.
* edit - using inStream.read (nextByte) instead of "nextByte [0] = (byte) inStream.read ();" does not write the nextByte variable, regardless of what I send to it over the serial connection.
* edit2 - since my code works flawlessly with the SUN javax.comm lib and win32com.dll, which I received from a friend, I stopped trying to get it to work with RXTX. I'm not interested in unlocking communications, which seems to be the only way other people can use RXTX.