打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
java读取硬件串口——数据断行问题

    如题,因为项目上的需要,让我使用Java读取硬件外设的串口数据并进行处理。之前也有C语言的基础,使用过串口读写程序,觉得挺简单的,,没放在心上。毕竟串口这也算是各种语言里面最基础的应用了吧,大的使用步骤都差不多。结果,出现的各种问题真是让我欲仙欲死啊。现在把问题的解决方法写一下。

    先说一下项目上的要求吧。我们这个项目需要高精度的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放到指定位置后,读取数据时出现异常。关键代码:

  1. //串口事件
  2. public void serialEvent(SerialPortEvent event) {
  3. switch(event.getEventType()) {
  4. case SerialPortEvent.BI:/*Break interrupt,通讯中断*/
  5. break;
  6. case SerialPortEvent.OE:/*Overrun error,溢位错误*/
  7. case SerialPortEvent.FE:/*Framing error,传帧错误*/
  8. case SerialPortEvent.PE:/*Parity error,校验错误*/
  9. case SerialPortEvent.CD:/*Carrier detect,载波检测*/
  10. case SerialPortEvent.CTS:/*Clear to send,清除发送*/
  11. case SerialPortEvent.DSR:/*Data set ready,数据设备就绪*/
  12. case SerialPortEvent.RI:/*Ring indicator,响铃指示*/
  13. case SerialPortEvent.OUTPUT_BUFFER_EMPTY:/*Output buffer is empty,输出缓冲区清空*/
  14. break;
  15. case SerialPortEvent.DATA_AVAILABLE:/*Data available at the serial port,端口有可用数据。读到缓冲数组,输出到终端*/
  16. byte[] readBuffer = new byte[1024];
  17. System.out.println('数据响应:----------------------->>');
  18. try {
  19. while (inputStream.available() > 0) {
  20. int numBytes = inputStream.read(readBuffer);
  21. }
  22. System.out.println(new String(readBuffer));
  23. } catch (IOException e) {}
  24. break;
  25. }
  26. }

异常如下:

                                         

本来应该是一整条的数据莫名奇妙的分段了,而且还没有规律。于是开始了我的折腾之旅:

    首先,检查硬件,排除;usb转串口驱动,没毛病;程序检查,没错;官方demo,还是断行;于是丢脸的给硬件提供商说,你们的硬件有问题;人家说用串口助手调试了没有问题,发过来的串口助手调试确实没有问题。结果争执半天,人家直接发过来一个新的,然而并没有问题。so,所有的问题都排除了,只能重写程序了。

    最后,经过N多次试验,N多论坛吸收经验,发现果然是程序问题。

    解决程序:在serialEvent()最开始插入一条语句

  1. try {
  2. Thread.sleep(50);
  3. } catch (InterruptedException ex) {
  4. Logger.getLogger(Test4.class.getName()).log(Level.SEVERE, null, ex);
  5. }

是串口读取程序在监听到数据到来以后,等待50ms在读取数据,这时候就没有数据断行的存在了。

三、分析

经过查询API得知,

available()方法返回的是不受阻碍的字节数,也可以理解成已经读取到内存中的字节数,当外设的发送速度太慢时,串口事件响应程序一次能从输入流之中读取到的字节数是不固定的,造成了读取到的数据断成了几行影响了接下来的数据处理。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
《(转)Java串口通讯》-王伟东的个人Blog|你好Blog
java实现上位机与下位机串口通信
用 Java 通过串口发送手机短信(一)环境安装设置
JS中的JSON对象
这个用Java写的开源音乐播放器,我粉了
Socket输入流的阻塞问题 - Java学习笔记 - HutaoW!
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服