首页 > 其他分享 >一种通用的arduino通信例程

一种通用的arduino通信例程

时间:2023-10-30 15:56:00浏览次数:31  
标签:Serial2 arduino 例程 通信 int detectString recv order openmv

本教程将给出一种通用的,适用于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()读出来的数据类型不确定的劣势,也省了很多麻烦,而且这样设计也有助于构建请求-响应的模型,也进一步提升了整个代码运行的稳定性。

标签:Serial2,arduino,例程,通信,int,detectString,recv,order,openmv
From: https://www.cnblogs.com/hnu-hua/p/17798053.html

相关文章

  • 使用IBM ART库生成交通信号牌的攻击样本
    目标:生成对抗样本,扰动图像,让原本是“停”的信号牌识别为“禁止驶入”: 代码如下(注意,因为我找的cnn原始模型支持的是灰度图像,所以彩色的对抗样本还需要修改代码):importcv2,osimportnumpyasnpimportnumpyasnpimporttensorflowastffromkeras.modelsimportload_......
  • 卫星通信工作频段
    卫星通信工作频段来源 https://zhuanlan.zhihu.com/p/403820083 ITU定义频段其中用于卫星通信的有:UHF(UltraHighFrequency)或分米波频段,频率范围为300MHz-3GHz。该频段对应于IEEE的UHF(300MHz-1GHz)、L(1-2GHz)、以及S(2-4GHz)频段。UHF频段无线电波已接近于视线传播,易被山体和建......
  • 5.5G移动通信技术
    5.5G即5G-Advanced,是一种移动通信技术。5.5G是5G和6G之间的过渡阶段,将在速率、时延、连接规模和能耗方面全面超越现有5G,有望实现下行万兆和上行千兆的峰值速率、毫秒级时延和低成本千亿物联。按照国际标准组织3GPP定义,5G到6G 间共存在Release15到Release20六个技术......
  • Arduino IDE安装esp32 SDK(Windows)2023.9.10更新
    原文:https://arduino.me/a/esp321.安装ArduinoIDE(如果已安装,直接跳到第二步)下载ArduinoIDE2.添加附加开发板地址打开ArduinoIDE菜单>文件>首选项,在 附加开发板管理器网址 输入框中,填入以下网址:https://arduino.me/packages/esp32.json3.安装社区离线包下载社区打包......
  • 工业自动化控制通信协议Profinet系列-3、CoDeSys软PLC方案介绍
    工业自动化控制通信协议Profinet系列-3、CoDeSys软PLC方案介绍文章目录工业自动化控制通信协议Profinet系列-3、CoDeSys软PLC方案介绍一、前言二、Profinet搭建资料收集三、CoDeSys系列四、接下来一、前言之前在树莓派desktop上已经成功编译运行测试程序,但是还需要主站去和其交互......
  • 无人机编队通信网络搭建
    文章目录前言一、ESP8266WIFI模块1.1电脑热点设置1.2esp8266设置二、P9001.接线2.数传配置2.1旧版P900的配置方法2.2新版P900的配置方法3.地面站配置4.常见问题三、DL-43P前言ubuntu20.04一、ESP8266WIFI模块使用的硬件是淘宝十块钱的ESP01s首先需要给模块刷写Pixracer的wifi......
  • 线程间通信
    线程间通信多线程编程步骤(中)第一,创建资源类,创建属性和操作方法;第二,在资源操作方法,1)判断2)工作3)通知;第三,创建多线程调用资源类的方法。案例要求,有两个线程,实现对一个初始值为0的变量,一个线程对值+1,一个线程对值-1。代码实现/***@author长名06*@version1.0*线程......
  • ESP32S3通过Arduino移植LVGL
    原文:https://www.jianshu.com/p/8306f948b854LVGL展示此lvgl开发板开源链接: 准备工作显示屏驱动,需要用到“画点”或者“画区域”函数触摸驱动,如果需要用到触摸功能,还需要准备触摸函数,该函数将会返回触摸坐标给lvgl修改lvgl下载下来的lvgl是不能直接使用的,需要......
  • STM32-基于标准库的中断串口通信
    目录STM32-标准库实现中断方式的串口通信实验任务实验过程总结体会参考STM32-标准库实现中断方式的串口通信实验任务使用标准库方式,设置USART1波特率为115200,1位停止位,无校验位,采用中断方式完成下列任务:STM32系统给上位机(win10)连续发送“hellowindows!”;当上位机给stm32发......
  • UniApp实战技巧:页面导航、数据传递和组件通信,以及资源管理和优化
    UniApp是一个基于Vue.js的开发框架,可以使用它快速构建跨平台的移动应用。本文将介绍UniApp中的一些实战技巧,包括页面导航、数据传递和组件通信。这些技巧可以帮助开发者更好地使用UniApp进行开发。1.页面导航在UniApp中,我们可以使用uni.navigateTo和uni.redirectTo等方法进行页面......