Code adapted from http://rxtx.qbang.org/wiki/index.php/Event_Based_Two_Way_Communication
I'm trying to read to a common buffer with the SerialReader class and send that buffer out over the Serial via the SerialWriter class, however the buffer is showing as null every time Writer is called. The code is initialised using the connect method of TwoWaySerialCommTest(pasted below for reference)
public SerialWriter ( OutputStream out )
{
this.out = out;
}
public SerialWriter ( OutputStream out, byte[] buffer)
{
this.out = out;
this.buffer = buffer;
}
public void run ()
{
while(true)
{
lock.lock();
try
{
dataAvailable.await();
System.out.println("Waking up");
int i = 0;
if (this.buffer != null)
{
System.out.println("Buffer isn't empty");
while(buffer[i] != ((byte)'\n') && i < buffer.length - 1)
{
this.out.write(buffer[i]);
}
}
else
{
System.out.println("Buffer is null");
System.out.println(this.buffer.toString());
}
}
catch ( IOException e )
{
e.printStackTrace();
System.exit(-1);
}
catch(Exception e)
{
e.printStackTrace();
}
finally
{
lock.unlock();
}
}
}
}
Serial Reader class
public static class SerialReader implements SerialPortEventListener
{
private InputStream in;
byte[] buffer;
public SerialReader ( InputStream in )
{
this.in = in;
}
public SerialReader (InputStream in, byte[] buffer)
{
this.in = in;
this.buffer = buffer;
}
public void serialEvent(SerialPortEvent arg0) {
lock.lock();
int data;
if (buffer != null)
{
for(int i = 0; i < buffer.length; i++)
{
if (buffer[i] != 0)
{
System.out.print((char)buffer[i]);
}
}
}
buffer = new byte[1024];
try
{
int len = 0;
while ( ( data = in.read()) > -1 )
{
if ( data == '\n' ) {
break;
}
buffer[len++] = (byte) data;
}
System.out.println(new String(buffer,0,len));
for(int i = 0; i < buffer.length; i++)
{
if (buffer[i] != 0)
{
System.out.print((char)buffer[i]);
}
}
System.out.println();
dataAvailable.signal();
}
catch ( IOException e )
{
e.printStackTrace();
System.exit(-1);
}
finally
{
lock.unlock();
}
}
}
TwoWaySerialCommTest (truncated)
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.concurrent.locks.*;
/**
* This version of the TwoWaySerialComm example makes use of the
* SerialPortEventListener to avoid polling.
*
*/
public class TwoWaySerialCommTest
{
static Lock lock = new ReentrantLock();
static Condition dataAvailable = lock.newCondition();
public volatile byte[] buffer;
public TwoWaySerialCommTest()
{
super();
}
void connect ( String portName ) throws Exception
{
CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName);
if ( portIdentifier.isCurrentlyOwned() )
{
System.out.println("Error: Port is currently in use");
}
else
{
CommPort commPort = portIdentifier.open(this.getClass().getName(),2000);
if ( commPort instanceof SerialPort )
{
SerialPort serialPort = (SerialPort) commPort;
serialPort.setSerialPortParams(57600,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);
InputStream in = serialPort.getInputStream();
OutputStream out = serialPort.getOutputStream();
(new Thread(new SerialWriter(out , buffer))).start();
serialPort.addEventListener(new SerialReader(in , buffer));
serialPort.notifyOnDataAvailable(true);
}
else
{
System.out.println("Error: Only serial ports are handled by this example.");
}
}
}
I believed codereview is for code that works.
以上就是Why does my buffer return as null in this code?的详细内容,更多请关注web前端其它相关文章!