我想从串口读取字节并按顺序写入。有什么方法可以通过在java中创建两个独立的读写函数来读取/写入串口?我写了一个程序但是在这里,即使打开了所需的COM端口,serialPort.getInputStream()也会给出一个空指针异常。
这是我的代码
package PhyCom;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.TooManyListenersException;
import javax.comm.CommPortIdentifier;
import javax.comm.PortInUseException;
import javax.comm.SerialPort;
import javax.comm.SerialPortEvent;
import javax.comm.SerialPortEventListener;
import javax.comm.UnsupportedCommOperationException;
import javax.xml.bind.DatatypeConverter;
public class COMConnect_DLMS
{
public static InputStream inputStream;
public static OutputStream outputStream;
SerialPort serialPort;
public long baudRate=19200;
public int dataBits=SerialPort.DATABITS_8;
public int stopBits=SerialPort.STOPBITS_1;
public int parity=SerialPort.PARITY_NONE;
boolean portFound = false;
String defaultPort="COM1";
static Enumeration portList ;
public static CommPortIdentifier portId;
public COMConnect_DLMS()
{
initialize();
}
private void initialize()
{
System.out.println("Establishing connection to UART");
portList = CommPortIdentifier.getPortIdentifiers();
while (portList.hasMoreElements())
{
portId = (CommPortIdentifier) portList.nextElement();
if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL)
{
if (portId.getName().equals(defaultPort))
{
System.out.println("Found port: "+defaultPort);
portFound = true;
}
}
}
try
{
serialPort = (SerialPort) portId.open("SimpleReadApp", 2000);
}
catch (PortInUseException e) {}
System.out.println(portId.getName());
try
{
inputStream=serialPort.getInputStream();
}
catch (IOException e) {e.printStackTrace();}
/*try
{
serialPort.addEventListener((SerialPortEventListener) this);
}
catch(TooManyListenersException e){}
serialPort.notifyOnDataAvailable(true);*/
try
{
// set port parameters
serialPort.setSerialPortParams((int) baudRate, dataBits,stopBits,parity);
}
catch (UnsupportedCommOperationException e) {}
try
{
outputStream=serialPort.getOutputStream();
}
catch (IOException e) {}
}
public void serialEvent(SerialPortEvent event)
{
if(event.getEventType()==SerialPortEvent.DATA_AVAILABLE)
{
byte[] readBuffer = new byte[20];
try
{
while (inputStream.available() > 0)
{
int numBytes = inputStream.read(readBuffer);
}
System.out.print(new String(readBuffer));
}
catch (IOException e) {System.out.println(e);}
}
}
public static void writePacket(byte[] msg)
{
System.out.println("Writing \""+DatatypeConverter.printHexBinary(messageString));
try
{
// write string to serial port
outputStream.write(msg);
// System.out.println("written");
}
catch (IOException e) {}
}
}
如果是串口,我还想了解更多关于NullPointerException的信息。谢谢。您的建议将不胜感激。
答案 0 :(得分:2)
嗯,这是一个问题:
try {
serialPort = (SerialPort) portId.open("SimpleReadApp", 2000);
} catch (PortInUseException e) {
}
如果由于某种原因,您无法打开该特定端口,则会出现空catch
块。更糟糕的是,您没有报告发生了什么,或者为什么决定连接失败。
但这就是打破你的原因。您忽略了serialPort
变量发生的任何错误,并将其设置为null
。它以字段的形式初始化。
如果您未能通过通话获得实例,那么您就不应该继续。考虑一下:
System.exit(1)
区块中发出catch
来电,表明您的计划无法继续,或serialPort
try...catch
中的{{1}}有关的初始化方法中包装 所有内容 。