设计定长通信指令(带帧起止符)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/mzldxf/article/details/102512029


在工业现场测控系统中,经常使用ASCII 自定义协议或者MODBUS-RTU之类的通信协议。本文主要介绍ASCII自定义协议中通信指令的设计。

定长指令

在通信指令中有定长指令和非定长指令,对于指令数目少的协议,我们可以采用简单的定长指令。

指令的构成

在这里插入图片描述
图1[1]: 通信指令样本
如图1所示,指令通常包括以下几个部分:起始字符,接收终端的地址,指令编号,需要传递的数据,终止符。除了数据部分以外,其他部分都是规定好的,不能更改。可以通过起始字符和终止字符来判断指令。

数据的构成

通常数据的构成有两种方式,上面采用的是数据本身的十进制数值,即%d。更多的情况其实是采用ASCII的方式,如图2所示:
在这里插入图片描述
图2:指令传递ASCII码数据
根据规定可以约定好数据1为高位,也可以以数据6为高位。在计算的时候注意先减去0x30再计算。

码校验

有时为了让通信更可靠,会采用校验,在指令中需要加一个校验码,例如累加和校验:
在这里插入图片描述
图3:累加和校验
例如计算从地址到数据6的和,然后取其低7位的和作为累加和校验码,写在命令里。在程序里计算后和命令中的0x22对比,是否一致,一致则认为数据传输无误。

代码示例

/*************************************************************************
* 满洲里国峰电子科技
* www.guofengdianzi.com
* 微信: GuoFengDianZi
***************************************************************************/
#define START 0X01
#define ADDRESS 0X60
#define COMMAND 0X0D
#define END 0X0E
#define COMMAND_LENGTH 10
unsigned char Buffer[BUFFER_LENGTH];

//读取串口缓存区内数据的个数
RxBuffLength_N=UART1_GetCharsInRxBuf();
//串口缓存区内数据的个数等于或超过了指令的长度,
if(RxBuffLength_N>=COMMAND_LENGTH){
	//将数据从缓冲区中导出					
	TransportUartData(&Buffer[0], RxBuffLength_N);
	//判断是否为该命令,是,则并计算数据的和,不是该命令返回DL101RETURN_ERROR报错
	ReturnValue=Read_and_Cal_ADValue(&Buffer[0], RxBuffLength_N);
	if(ReturnValue==DL101RETURN_ERROR)
		ReturnValue=0;//返回值为0说明有错误,放弃本次计算
	else
		printf("sum=%d\r\n",ReturnValue);//输出计算结果
}		

作者:伏熊(专业:射频芯片设计、雷达系统。爱好:嵌入式。欢迎大家项目合作交流。)
微信:GuoFengDianZi

引用:
[1]: www.guofengdianzi.com

猜你喜欢

转载自blog.csdn.net/mzldxf/article/details/102512029