您的位置:首页 > 编程语言 > Java开发

Java接收串口数据

2015-07-09 17:25 567 查看
参考《ava接收串口数据》,开源中国社区

自己的使用经验:

1.ReadPort()虽然可以提供外部java读取数据,但最好添加一个延时,否则很容易出现读取若干次后程序没有响应,但又不报错的问题。

2.此程序中serialPort.addEventListener(this);有可能会产生触发不了数据接收程序。所以最好在本地建立本程序的实例,然后加载该实例就可以读取到数据了。
SerialBean serialBean = new SerialBean();

serialPort.addEventListener(serialBean);


3.信息的标志位这个还是自定义一下比较好。

import java.io.*;
import java.util.*;
import javax.comm.*;

public class SerialBean implements Runnable,SerialPortEventListener
{
String PortName;
int baud;
CommPortIdentifier portId;
SerialPort serialPort;
static OutputStream out;
static InputStream in;
String Buf=null;// 缓存一条最新信息
boolean hasData=false;// 标志有无新数据
StringBuilder buf=new StringBuilder(128);
Thread readThread;

public SerialBean(int PortID,int baud)
{
PortName="COM"+PortID;
this.baud=baud;

}

public int Initialize()
{
int InitSuccess=1;
int InitFail=-1;
try
{
portId=CommPortIdentifier.getPortIdentifier(PortName);
try
{
serialPort=(SerialPort)portId.open("Serial_Communication",2000);
serialPort.setSerialPortParams(this.baud,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);
serialPort.addEventListener(this);
serialPort.notifyOnDataAvailable(true);
}
catch(PortInUseException e)
{
return InitFail;
}
catch(TooManyListenersException e)
{
return InitFail;
}
catch(UnsupportedCommOperationException e)
{
return InitFail;
}
try
{
in=serialPort.getInputStream();
out=serialPort.getOutputStream();
}
catch(IOException e)
{
return InitFail;
}

}
catch(NoSuchPortException e)
{
return InitFail;
}
readThread=new Thread(this);
readThread.start();
return InitSuccess;
}

public boolean hasData()
{
return hasData;
}
public String ReadPort()
{
if(hasData)
{
this.hasData=false;
return this.Buf;
}
else
return null;
}

@SuppressWarnings("deprecation")
public void ClosePort()
{
if(readThread!=null )
readThread.stop();
if(serialPort!=null)
serialPort.close();
}
@Override
public void serialEvent(SerialPortEvent event)
{
/**
* 事件类型:
*
* BI -通讯中断.    CD -载波检测.    CTS -清除发送.    DATA_AVAILABLE -有数据到达.   
* DSR-数据设备准备好.    FE -帧错误.    OE -溢位错误.    OUTPUT_BUFFER_EMPTY
* -输出缓冲区已清空.    PE -奇偶校验错. RI - 振铃指示.
*/
switch(event.getEventType())
{
case SerialPortEvent.BI:
case SerialPortEvent.OE:
case SerialPortEvent.FE:
case SerialPortEvent.PE:
case SerialPortEvent.CD:
case SerialPortEvent.CTS:
case SerialPortEvent.DSR:
case SerialPortEvent.RI:
case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
break;
case SerialPortEvent.DATA_AVAILABLE:

try
{
char b;
while(in.available()>0)
{
b=(char)in.read();
buf.append(b);
}
int beg=0,end=0;
for(int i=0;;i++)
{
if(buf.length()<2)
{
return;
}
if(buf.charAt(0)=='\r'&&buf.charAt(1)=='\n')// 以回车换行开头
{
beg=2;
}
else
// 不以换行开头
{
beg=0;
}
end=buf.indexOf("\r\n",beg);
if(end==-1)// 未接受完一整条信息
break;
Buf=buf.substring(beg,end);// 截取数据
buf.delete(0,end+2);// 删除已用数据
System.out.printf("--%s--\n",Buf);
this.hasData=true;

}

// System.out.println(con);

ce3c
}
catch(IOException e)
{
}
break;
}
}

public void run()
{
try
{
Thread.sleep(2000);
}
catch(InterruptedException e)
{
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 串口 数据