Java实现串口粘包拆包

Java根据协议进行拆包解决串口粘包

串口通信原理
1.串口通信指串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。
2.串口是计算机上一种非常通用的设备通信协议(不要与通用串行总线Universal SerialBus或者USB混淆)
3.典型地,串口用于ASCII码字符的传输。通信使用3根线完成:(1)地线,(2)发送,(3)接收。由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。其他线用于握手,但是不是必须的。串口通信最重要的参数是比特率、数据位、停止位和奇偶校验。对于两个进行通信的端口,这些参数必须匹配

粘包拆包

我们将串口通信的数据流类比作河流的流水,是连成一片的,中间并没有分隔界限。

举个例子,假设 PC 机(上位机)要通过串口向某传感器设备(下位机)发送两条消息,第一条是「 Hello 」;第二条是「 Serial Port 」。

理想情况下下位机应该收到两条消息分别解析为「 Hello 」和「 Serial Port 」,但是串口数据流是没有分隔界限的。

倘若两次通信的时间间隔较短,下位机可能只会收到一条消息「 Hello Serial Port 」,这就是粘包。

下位机也有可能会收到两条消息但是读取的时候分别识别为「 Hello Ser 」和 「 ial Port 」,这就是拆包。

因为串口数据流底层并不了解上层业务数据的具体含义,这就涉及到两个设备在进行串口通信时如何进行数据截断的问题,粘包拆包问题只能通过上层的应用协议栈设计来解决。

粘包和拆包不仅出现在串口通信中,而是一类问题。TCP 通信同样需要处理战报和拆包,对此,业界已经形成了几种主流的解决方案,netty解决粘包拆包可以见我上一篇博客。

准备工作
由于笔记本或台式机上基本上都没有成对的串口提供给我们调试使用,我们就需要下载虚拟串口软件来实现串口调试。

1.下载虚拟串口软件http://pan.baidu.com/s/1hqhGDbI(这里提供的还是比较好用)。下载安装完成后先不要急着运行,把压缩包中的vspdctl.dll文件复制到安装目录下如:我的目录为–>D:SoftWareInstallVirtual Serial Port Driver 7.2 替换原有文件即可成功激活。
2.打开软件添加虚拟串口,一般都是成对添加的(添加COM1、COM2)后如图所示:

Java实现串口粘包拆包
串口处理粘包
串口处理粘包网上的代码基本都是c++,java的参考代码少之又少。
串口的基础代码可以看着篇博客,讲的很详细,获取可用串口,发送接收数据和注册监听器等
串口通信基础代码
给串口注册监听器,如果串口监听到有数据传来,就会触发readdata方法,如果缓冲区的数据不进行读取,就会不断就行循环,直到缓冲区数据被读取为止。
Java实现串口粘包拆包

如图所示,我申请了一个bytebuf缓冲区,为了防止被重新刷新我把他放在方法外。inputstream缓冲区的数据一个字节一个字节的读到bytebuf中,然后剩下的就根据你的协议来写对应的逻辑进行拆包,和netty一模一样了。
netty根据协议进行粘包拆包

可以参考我的上一篇博客,链接地址贴出来了。
放一下readdata的代码

我们最后来进行测试,如图一次性发三条报文。发现拆成了一条一条的并且显示了,还可以处理垃圾报文,如果把一条报文拆成两部分发也会合成一条报文并显示,感兴趣的可以测试测试

Java实现串口粘包拆包
最后如果对这部分感兴趣可以私信我,我发给你们项目代码。

文章知识点与官方知识档案匹配,可进一步学习相关知识Java技能树首页概览91301 人正在系统学习中

来源:小张佩奇zjq

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年4月2日
下一篇 2020年4月2日

相关推荐