介绍
串口是十分常用的一个资源, 每次需要进行处理串口数据, 但是 PC 上的串口存在缓冲区机制, 导致串口跟我们在单片机中的使用方式可能有所不同,
每次拿到缓冲区数据之后,判断是否满足帧头,进而开始新的一帧数据计数存储, 最终满足一帧数据之后 将数据发送出来.
原理
我们使用自定义的存储结果 作为自己的存储结果, 一般来说在项目中使用就是帧数据长度是一致的, 我们的程序也是基于这个原理的
class SerialData
{
public:
uchar *data_; ///< 帧数据
uchar *head_; ///< 帧头数据
int dat_len_; ///< 数据帧长度
}
我们需要根据自己的协议初始化数据长度和数据帧头内容 假设我们的数据为 14 个字节 包括 一般使用串口通信的数据都是按照这种格式进行的数据发送,
[帧头] [长度] [地址] [指令] [数据] [校验]
00 01 02 03 04 05 06 07 08 09 10 11 12 13
68 0D 00 84 00 04 09 11 79 45 00 81 13 01
frame_len = 14;
data_ = new uchar[frame_len]; ///< 存储数据
head_ = new uchar[4]{
0x68,0x0D,0x00,0x84 }; ///< 旧版协议头
实际上我们确定通信协议之后,PC不存在命令之类的解析的话,可以把前面四个字节处理帧头,
每次接收到帧头四个字节的时候表示数据已经重新开始了一帧,将收集到的数据存储相应的流程即可,继续处理后续数据
- 如果数据正常, 读取到帧头数据之后,假设帧头数据一致, 数据依次往后填充数据,等到数组填满,会再次获取到帧头数据
- 根