arduino实现一个自定义通信协议解析库

在做遥控小车时, 手柄会发送一串二进制数据到小车上, 免不了进行自定义协议的解析, 有时仅仅发送三个字节解析起来却比较麻烦, 而且可靠性也不行。
为了不需要每次都进行晦涩的复杂的协议解析,这个库就此诞生了。
该库支持arduino uno, stm32, esp32 

为了实现简单协议定义为:
(帧头)+实际数据+数据长度(一个字节)+(帧尾)
该库的作用是实现从一串杂乱无章的字节数组中找出符合自定义通信协议包裹的 ”实际数据“部分取出来。

demo:

#include <Arduino.h>
#include "cxg_Command.h"

static CxgCommand command;

void setup() {
  Serial.begin(115200);
  delay(1000);

  //设置缓冲区大小, 预计指令的最大的长度
  command.setBufferSize(20);
  byte start[2] = {0xff, 0xfe};
  //设置开始指令开始的匹配
  command.setStart(start, 2);
  byte end[2] = {0xfd, 0xfc};
  //设置结束指令结束的匹配
  command.setEnd(end, 2);

  //设置指令处理回调
  command.setResolveCommandCallback([](byte* buff, int startIndex, int length) {
    int endIndex = startIndex + length;
    Serial.println("receive Command: ");

    for(int i = startIndex; i < endIndex; i++) {
      Serial.print(*(buff + i), HEX);
      Serial.print(" ");
    }
    Serial.println("\n");
  });

  //设置发送数据的回调实现
  command.setSendCommandCallback([](byte* buff, int length) {
    //通过串口发送
    Serial.write(buff, length);
  });

  int size = 22;
  byte data[size] = {0x45, 0x56, 0xff, 0xfe, 0xf4, 0x01, 0x01, 0x03,
    0xfd, 0xfc, 0x35, 0x56, 0xff, 0xfe, 0x01, 0xf4,
    0x21, 0xfe, 0x02, 0x05, 0xfd, 0xfc};
  for(int i = 0; i < size; i++) {
    //往里添加数据
    command.addData(data[i]);
  }

  //发送指令
  byte selfData[5] = {0x45, 0x56, 0xff, 0xfe, 0xf0};
  // command.sendCommand(selfData, 5);
}

void loop() {
  while(Serial.available()) {
    //接收指令, 直接跟串口结合
    command.addData(Serial.read());
  }
}

字符串版: 

解析格式为 {param=value&param1=value1|n(指令名称,一个字符)|vv(验证码两个字符, 可为空)}

#include <Arduino.h>
#include "cxg_Command_String.h"

static CxgCommandString command;

void setup() {
  Serial.begin(115200);

  //设置缓冲区大小
  command.setBufferSize(250);
  //设置解析指令回调
  command.setResolveCallback([](char name, char* body, int length) {
    Serial.print("receive command name: ");
    Serial.println(name);
    Serial.print("receive command body: ");
    Serial.println(body);

    if(name == 's') {
      Serial.print("send command: ");
      //发送一个指令
      command.sendCommand('s', "a=hello");
      Serial.println("");
    }
  });

  //设置发送指令回调
  command.setSendCallback([](char* buff, int length) {
    Serial.write(buff);
  });
}

void loop() {
  //串口助手发送  qwe{a=123|q}sdf{b=123|s}rty 看看
  while(Serial.available()) {
    //接收指令, 直接跟串口结合
    command.addData(Serial.read());
  }
}

下载地址: GitHub - chengxg/cxg-arduino-lib: 我的一些arduino库

  • 6
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
实现自定义串口通信协议可以通过以下几个步骤来完成。 第一步是确定协议的基本要素,包括帧格式、数据字段和控制字段等。帧格式可选择起始位、数据位、校验位和停止位等组成,数据字段用于传输需要通信的数据,控制字段用于控制通信过程。 第二步是确定通信双方的通信流程和通信规则。通信流程包括建立连接、数据传输和断开连接等步骤,通信规则包括数据发送方和接收方之间的协作方式、错误处理方式等。 第三步是实现软件端和硬件端的通信功能。在软件端,可以使用编程语言如Python、C++等来实现自定义协议的编码和解码功能,将要发送的数据按照协议格式编码后发送,接收到的数据按照协议格式解码后进行处理。在硬件端,可以使用控制芯片如8051、Arduino等来实现串口通信的物理层功能。 第四步是进行通信测试和调试。在通信过程中,可以通过单元测试和集成测试来验证协议的正确性和可靠性,通过日志记录和错误处理来定位和解决通信中出现的问题。 最后一步是对协议进行优化和改进。根据实际需求,可以对协议的性能、安全性和扩展性等进行改进,提高通信速度、保护数据安全和支持更多的功能扩展。 总之,实现自定义串口通信协议需要考虑协议的基本要素、通信流程和通信规则,并在软硬件端进行功能实现和测试调试,最后对协议进行优化和改进。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值