本帖最后由 z01228 于 2021-1-12 01:46 编辑
这个是我自己写的串口的自定义通信协议(字符串形式),目前就只对命令长度以及数据的取模校验来保证数据的稳定性。也算是对之前的帖子总结下。
程序分编码发送和接收解码两个部分。具体的应用需要自己对程序进行修改
发送编码:
- /**自定义串口通信协议**
- 通信协议-写(txxy-tx)
- 示例程序使用背景:一个arduino开发板不能完成项目的任务时,就需要两个或者多个模块进行配合使用。
- 期间就需要通过串口(软,硬串口)传达参数,为了传达参数的准确性就需要我们设计通信协议。
- 这个示例是命令字符串编码 发送部分并且只有一个参数(因为取模校验的原因这个参数只能是整数型),
- 有需要更多参数可以自己添加。数据是明文发送没有加密
-
- 命令格式“A数据值-L长度值-C校验值#”--
- 命令字符串comdata示例:A**L**C*#(A2111L11C5#)
- 长度是完整的命令字符串的长度(字符)
- 校验是校验数据的准确性,与check(本示例是9)取模的结果
- 试验结果:
- 完整字符串命令:A2111L11C5#
- 完整命令字符串长度 L:11
- 取模数 check:9 校验值 C:5
- */
- //数据部分
- String comdata = ""; //串口命令字符串
- String A="A"; // 数据开始位
- int id1=2111; //数据1
- //数据核验部分
- String L="L"; //数据长度开始位
- int leng=0; //数据长度
- String C="C"; //检验开始位置
- int check = 9; //取模数
- int Ch=0; //取模的结果
- String io="#"; //结束符3
- void setup() {
- Serial.begin(9600); //硬串口
- Ch=id1%check;//计算数据的取模数
- int leng=0;//数据长度置0
- comdata += A;
- comdata += id1;
- comdata += L;
- leng=comdata.length();//原始命令字符串的长度获取
- leng=leng+3; //提前补充个"L--校验位--#"的长度
-
- //下面的这个if函数是保证命令字符串在10位是正常的 不能删除 --命令字符串长度在99以内是有效的。
- if(leng>=9){leng=leng+2;//如果原始数据没有加长度命令的时候是大于等于9,长度就只需要+2 多出来的是一个数据位一个长度位
- } else{
- leng=leng+1; //如果原始数据没有加长度命令的时候是小于9,长度就只需要+1
- }
- comdata += leng;
- comdata += C;
- comdata += Ch;//**在命令字符串里加入计算完毕的长度
- comdata += io;//**在命令字符串里加入"#"
- leng=comdata.length();
-
- Serial.print("完整字符串命令:"); //换行
- Serial.println(comdata); //打印完整命令字符串
-
- Serial.print("完整命令字符串长度 L:"); //换行
- Serial.println(leng); //打印完整命令字符串长度
- Serial.print("取模数 check:"); //换行
- Serial.print(check); //打印完整命令字符串长度
- Serial.print(" 校验值 C:"); //换行
- Serial.println(Ch); //打印完整命令字符串长度
- Serial.println(""); //换行
-
-
- }
- void loop() {
- // put your main code here, to run repeatedly:
- }
复制代码
接收解码:
|