java上位机通信协议实现

本文介绍了一种使用Java实现上位机与单片机通信的方案,核心是利用rtrx串口通信包。文章详细阐述了通信协议的原理,包括包头、标志位、数据和包尾的设计,并解决了数据接收不完整和错误恢复的问题。通过维护数据缓存和记录下标,确保了数据帧的正确拼接和传输。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  概述:以前项目中用java写了一个上位机用来观察单片机发送的数据(连续不断的传送图片以形成视频),在实际使用中发现偶尔会发生图片显示错误的问题(每张图片都显示为前一张的下半段和本张图的上半段),最近有时间对这个问题进行了修复。 本文首先会概括的叙述java上位机的原理,然后会说明通信协议的实现思路,最后会附上上位机和下位机通讯部分的代码,方便大家学习。


1. 上位机原理:java编写上位机的核心是使用rtrx串口通信包进行数据的收发。在我们我们的应用中,使用了监听器框架,当监听到有数据发送时,进行数据接收和解析。最终的实现在数据处理过程中分为4个部分:

(1).改写下位机传送格式 + 包头0x55 + 标志位0x5a + 包尾0xaa  (在发送时让这些值变成其近似值,不影响下位机的计算)
(2).java 读取串口数据,每次读取图片中的一段数据(由于单片机速度慢造成)
(3).根据数据传送协议进行数据打包,将每帧图片找出来。(解决如下2个问题:能够把不完整的数据帧拼接成完整的数据帧。例如从“12345数据头,标志位12345数据尾123”准确地检索出所需要的数据帧,或者把“数据头,标志位12345”和“12345数据尾”拼接成一个完整的数据帧。)
(4).对于数据帧进行处理


2.遇到的问题和解决办法:在接收数据的过程中,我发现当传送的数据量很大时,由于单片机发送的速度比上位机慢很多,上位机不能一次收到所有单片机发送的数据。所以我想出了第一种解决方案。让接受数据的地方阻塞直到接受完毕一帧数据。

			while(readCount < count) {
				readCount += in.read(bytes,readCount,count - readCount);
			}

count是要接受的数据帧长度。只有接受完指定字节数时,才会从读数据的地方返回。

使用这种简单醋拌的方法后我又发现了一个问题,当其中有某一帧图像出错后,出错后的图像都是错误的。所以加上了一个标志位来校验

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值