java读取硬件串口——数据断行问题
来源:互联网 发布:封印者数据库 编辑:程序博客网 时间:2024/05/16 12:55
先说一下项目上的要求吧。我们这个项目需要高精度的GPS(全球定位系统)的定位数据和时间,需要最少5HZ的数据发送频率。也就是说串口最少每200ms发送一次数据,数据的格式请参阅GPS模块编程之NMEA0183协议。
首先,在解决问题的过程中,参考了一些前辈的经验,感谢前辈们的贡献!
本文主要讲解遇到的串口读取数据异常的问题,关于串口的一般讲解和一般方法请参考下面几位前辈的博客:
1、Java串口编程:串口数据的发送与监听读取
2、Java串口通信详解
3、java基于RXTXcomm.jar的串口通信
一、Java读取串口的方式
目前比较常见的针对Java的串口包有3个来源:一是1998年SUN发布的串口通信API:comm2.0.jar(Windows环境下)和comm3.0.jar(Linux/Solaris环境下);二是IBM的串口通信API;三是一些开源的API。
SUN公司发布的官方串口包已经停止更新,而且目前只支持32位操作系统。所以只能使用rxtx开发包。
我的开发环境是:windows7-64bit;java version "1.8.0_151"; mfz-rxtx-2.2-20081207-win-x64.zip。
注意:1、Windows_64bit可以使用32bit的JDK,但是32位系统不能使用64位JDK。 最好就是操作系统、JDK、JAR包的位数全都保持一致。
2、rxtx下载注意所下载的jar包的位数,不同位数的jar包不能使用。
3、环境配置请参考几位前辈的博客。
二、遇到问题(读取数据)
根据前面配置好Java串口环境,把jar包和dll放到指定位置后,读取数据时出现异常。
关键代码:
//串口事件 public void serialEvent(SerialPortEvent event) { switch(event.getEventType()) { case SerialPortEvent.BI:/*Break interrupt,通讯中断*/ break; 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:/*Output buffer is empty,输出缓冲区清空*/ break; case SerialPortEvent.DATA_AVAILABLE:/*Data available at the serial port,端口有可用数据。读到缓冲数组,输出到终端*/ byte[] readBuffer = new byte[1024]; System.out.println("数据响应:----------------------->>"); try { while (inputStream.available() > 0) { int numBytes = inputStream.read(readBuffer); } System.out.println(new String(readBuffer)); } catch (IOException e) {} break; } }
异常如下:
本来应该是一整条的数据莫名奇妙的分段了,而且还没有规律。于是开始了我的折腾之旅:
首先,检查硬件,排除;usb转串口驱动,没毛病;程序检查,没错;官方demo,还是断行;于是丢脸的给硬件提供商说,你们的硬件有问题;人家说用串口助手调试了没有问题,发过来的串口助手调试确实没有问题。结果争执半天,人家直接发过来一个新的,然而并没有问题。so,所有的问题都排除了,只能重写程序了。
最后,经过N多次试验,N多论坛吸收经验,发现果然是程序问题。
解决程序:在serialEvent()最开始插入一条语句
try { Thread.sleep(50); } catch (InterruptedException ex) { Logger.getLogger(Test4.class.getName()).log(Level.SEVERE, null, ex); }是串口读取程序在监听到数据到来以后,等待50ms在读取数据,这时候就没有数据断行的存在了。
三、分析
经过查询API得知,
available()方法返回的是不受阻碍的字节数,也可以理解成已经读取到内存中的字节数,当外设的发送速度太慢时,串口事件响应程序一次能从输入流之中读取到的字节数是不固定的,造成了读取到的数据断成了几行影响了接下来的数据处理。
- java读取硬件串口——数据断行问题
- java读取串口数据
- java通过串口读取数据
- java监听、读取串口数据
- java串口读取数据(转载)
- Java+jSSC 串口从读取数据
- Java通过串口读取数据例子
- java 串口编程----设置缓冲屈来读取串口数据
- Java串口编程:串口数据的发送与监听读取
- Java串口编程:串口数据的发送与监听读取
- MFC读取串口数据
- 读取串口数据画图
- 线程读取串口数据
- MFC读取串口数据
- 读取串口数据画图
- Web串口读取数据
- QT串口读取数据
- 串口读取数据
- SSH2框架整合小案例
- Python生成简单分形
- 大端法、小端法、网络字节序
- Redux
- 每日一练 20171113
- java读取硬件串口——数据断行问题
- Karma中文配置API
- python入门(一)
- 笔记 javascript test()方法
- 卸载Linux自带的jdk
- UVa 10868
- 不同价位有哪些值得推荐的扫地机器人?
- JavaScript连缀
- python实现k-means聚类算法--可用