做一个小程序,rfid接开发板连到串口,需要从串口读取rfid的刷卡信息并显示。
现在的问题是:1、为什么会出现不识别的小框? 2、困扰许久……为什么刷同一张ic卡,显示卡号会有变化?这个用串口调试软件也是一样的问题……
串口通信代码如下:
public class ReadSerial implements Runnable,SerialPortEventListener {
static Enumeration<CommPortIdentifier> portList;
static CommPortIdentifier portId;
InputStream inputStream;
SerialPort serialPort;
Thread readThread;
@SuppressWarnings("unchecked")
public static void main(String[] args){
/*不带参数的getPortIdentifiers方法获得一个枚举对象
* 该对象又包含了系统中管理每个端口的CommPortIdentifier对象
* 这里的端口不仅仅是指串口,也包括并口*/
portList=CommPortIdentifier.getPortIdentifiers();
while(portList.hasMoreElements()){
portId=(CommPortIdentifier) portList.nextElement();
if(portId.getPortType()==CommPortIdentifier.PORT_SERIAL){
if(portId.getName().equals("COM7")){
@SuppressWarnings("unused")
ReadSerial reader=new ReadSerial();
}
}
}
}
public ReadSerial(){
/*open方法打开通讯端口,获得一个CommPort对象
*参数1 应用程序名,参数2 在端口打开时阻塞等待的毫秒数*/
try {
serialPort=(SerialPort) portId.open("jjt", 2000);
} catch (PortInUseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
/*获取端口的输入流对象*/
try {
inputStream=serialPort.getInputStream();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
/*注册一个SerialPortEventListener事件来监听串口事件*/
try {
serialPort.addEventListener(this);
} catch (TooManyListenersException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
/*数据可用*/
serialPort.notifyOnDataAvailable(true);
/*设置串口初始化参数*/
try {
serialPort.setSerialPortParams(115200, //波特率
SerialPort.DATABITS_8, //数据位
SerialPort.STOPBITS_1, //停止位
SerialPort.PARITY_NONE); //校验
} catch (UnsupportedCommOperationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
readThread=new Thread(this);
readThread.start();
}
@Override
public void serialEvent(SerialPortEvent event) {
// TODO Auto-generated method stub
switch(event.getEventType()){
case SerialPortEvent.BI:
case SerialPortEvent.OE:/*Overrun error,溢位错误*/
case SerialPortEvent.FE:/*Framing error,传帧错误*/
case SerialPortEvent.PE:/*Parity error,校验错误*/
case SerialPortEvent.CD:/*Carrier detect,载波检测*/
case SerialPortEvent.CTS:/*Clear to send,清除发送*/
case SerialPortEvent.DSR:/*Data set ready,数据设备就绪*/
case SerialPortEvent.RI:/*Ring indicator,响铃指示*/
case SerialPortEvent.OUTPUT_BUFFER_EMPTY:/*输出缓冲区清空*/
break;
case SerialPortEvent.DATA_AVAILABLE:/*端口有可用数据。读到缓冲数组,输出到终端*/
byte[] readBuffer=new byte[1024];
int count=0;
try {
/*返回读取的字节数*/
count = inputStream.read(readBuffer);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
/*从开始读到count个字节再转为字符串*/
String readStr=new String(readBuffer,0,8);
System.out.println(readStr);
}
}
@Override
public void run() {
// TODO Auto-generated method stub
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}