概述:以前项目中用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是要接受的数据帧长度。只有接受完指定字节数时,才会从读数据的地方返回。
使用这种简单醋拌的方法后我又发现了一个问题,当其中有某一帧图像出错后,出错后的图像都是错误的。所以加上了一个标志位来校验