本文主要是介绍Arduino自定义通信协议解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
上一篇文章给出了通信协议的设计。通信协议的格式如下:
协议首部 | 指令长度 | 控制指令 | 校验和 |
“控制指令”设计成如下格式:
设备类型 | 设备号 | 端口号 |
比如说上位机发送如下的格式的数据:AA0305020106,意思就是协议的首部为AA,指令长度为03,控制指令为050201:实际意义就是设备类型为05,设备号为02,端口为01,这三个数据的校验和为06.现在需要写一个类库,称为ProtocolParser,来解析上述格式的数据。思路也很简单,就是将串口发送的数据存起来,再解析该数据各个字段的含义即可。类库采用C++写的,面向对象的风格。
ProtocolParser.h的源码如下:
#ifndef PROTOCOLPARSER_H
#define PROTOCOLPARSER_H
/*
自定义的库函数协议解析器 V1.0
解析的数据格式:协议首部-指令长度-控制指令-校验和
"控制指令"格式:设备类型-设备号-端口号*/
#include<stdlib.h>
#include<string.h>
//#include <string>
//#pragma warning(disable:4996)
#define BUFFER_SIZE 128//假定接收数据的最大长度为128
class ProtocolParser
{
public:ProtocolParser(char *header);~ProtocolParser();void Append(char *data);void AppendChar(char ch);//将从串口接收到的字符存到buffersize_t GetDeviceType();//获取设备类型size_t GetDeviceNumber();//获取设备号size_t GetPort();//获取设备所连接的端口号private:bool m_bInCmd;//标志位,标识一条控制指令是否接收完毕char *m_pHeader;//协议首部size_t m_nCmdLength;//指令长度char *m_pCtrlCmd;//控制指令size_t m_nCheckSum;//校验和char buffer[BUFFER_SIZE];//接收的数据暂时存在buffer中size_t m_nRecvDataIndex;//记录接收数据的索引char GetHeader(size_t index);//获取协议首部指定索引的字符size_t GetCmdLength();//获取控制指令长度size_t GetRecvDataLength();//获取接收到的一条控制指令的长度size_t GetCheckSum();//获取实际接收到的校验和
};//构造函数初始化,header为协议首部
Proto
这篇关于Arduino自定义通信协议解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!