一种通用的arduino通信例程

发布时间 2023-10-30 15:51:32作者: ihuahua1415

本教程将给出一种通用的,适用于arduino(uno和mega等)单片机的一个通信的教程,通过对例程的修改,可以做成任意的符合需求的代码,下面请看。

// 函数定义
String detectString_openmv();
int recv_order();

String detectString_openmv()  // 判断传入的字符串能否被接收
{
  // 我们传入的数据形式 {int&}
  while (Serial2.read() != '{')
    ;
  //返回"{}"中的字符串
  return (Serial2.readStringUntil('}'));
}

int recv_order()  // 接收openmv指令
{
  int order;
  while (1) {
    if (Serial2.available()) break;
  }
  String s = detectString_openmv();
  Serial2.flush();    // 清除openmv串口现在还有的缓存数据
  String numStr = "";
  for (int i = 0; i < s.length(); i++) {
    if (s[i] == '&')  // 终止标志
    {
      order = numStr.toInt();
    } else {
      numStr += s[i];
    }
  }
  return order;  // 指令
}

上面定义了两个函数,分别是detectString_openmvrecv_order, recv_order中调用detectString_openmv, 可根据自己的实际需求对recv_order中的for循环的具体的内部逻辑进行修改,来得到自己想要的数据,当然也可自己约定两个设备间的通信的协议,保证数据不会乱。Serial2.flush();这个操作其实是比较重要的,因为经测试发现,其在通信的过程中,总会有多余的数据残留在缓存区,此时在这进行一个清除操作,即可保证下次数据再进来的时候或者进行类似于Serial2.available()这种判断是不会出错。

整个代码其实是比较巧妙的,充分利用了可自定义协议的优势,摆脱了用Serial2.read()读出来的数据类型不确定的劣势,也省了很多麻烦,而且这样设计也有助于构建请求-响应的模型,也进一步提升了整个代码运行的稳定性。