1.通常,串口通信应用程序有两种模式
(1)实现SerialPortEventListener接口,监听各种串口事件并作相应处理
(2)建立一个独立的接收线程专门负责数据的接收
2.事件监听模型
(1)首先需要在你的端口控制类(例如SManager)加上“implements SerialPortEventListener”
(2)在初始化时加入如下代码:
try {
SerialPort sPort.addEventListener(SManager);
} catch (TooManyListenersException e) {
sPort.close();
throw new SerialConnectionException(“too many listeners added”);
}
sPort.notifyOnDataAvailable(true);
(3)覆写public void serialEvent(SerialPortEvent e)方法,在其中对如下事件进行判断:
<1>BI -通讯中断。
<2>CD -载波检测。
<3>CTS -清除发送。
<4>DATA_AVAILABLE -有数据到达。
<5>DSR -数据设备准备好。
<6>FE -帧错误。
<7>OE -溢位错误。
<8>OUTPUT_BUFFER_EMPTY -输出缓冲区已清空。
<9>PE -奇偶校验错。
<10>RI - 振铃指示。
(4)最常用的就是DATA_AVAILABLE--串口有数据到达事件
(5)当串口有数据到达时,可以在serialEvent中接收并处理所收到的数据
(6)存在一个十分严重的问题:数据严重丢失
3.串口读数据的线程模型
(1)这个模型顾名思义,就是将接收数据的操作写成一个线程的形式
public void startReadingDataThread() {
Thread readDataProcess = new Thread(new Runnable() {
public void run() {
while (newData != -1) {
try {
newData = is.read();
System.out.println(newData);
//其他的处理过程
} catch (IOException ex) {
System.err.println(ex);
return;
}
}
readDataProcess.start();
}
(2)在应用程序中,将收到的数据打包放到一个缓存中,然后启动另一个线程从缓存中获取并处理数据
(3)两个线程以生产者—消费者模式协同工作,解决了丢数据问题
(4)存在数据接收延迟:这一延迟对于一个实时的显示系统来说简直是灾难
4.TinyOS中(又是开源的)
(1)有类似的串口通信部分,代码如下:
public byte[] getPack(){
while (true) {
// PacketLength为数据包长度
byte[] msgPack = new byte[PacketLength];
for(int i = 0; i 《 PacketLength; i++){
if( (newData = is.read()) != -1){
msgPack[i] = (byte) newData;
System.out.println(msgPack[i]);
}
}
return msgPack;
}
}
(2)没有丢失数据的现象行出现,也没有数据接收延迟了
(3)唯一需要注意的就是当串口停止发送数据或没有数据的时候is.read()一直都返回-1
(4)如果一旦在开始接收数据的时候发现-1就不要理它,继续接收,直到收到真正的数据为止
5.总结:
(1)如果应用程序需要很精密的结果,传输数据的速率又很快的话,就最好不要用第一种方法
(2)对于第二种方法,是线程导致的问题,对于那些处理多线程比较好的机器来说,应该会好一些
(3)对于数据量比较大的传输来说,用第三种方法
(4)对于数据发送速率不是如此快的情况下前面者两种模型应该还是好用的,特殊情况还是应该特殊处理