OpenMV与Arduino通信—串口

2023-05-16

文章目录

  • `Arduino`的串口函数
    • 接收函数`Serial.read()`
    • 检测串口`Serial.available()`
    • 串口通信例程
      • `OpenMV`代码
      • `Arduino`代码

所有要进行串口通信的设备, GND必须相连 (共地)

——>因为我们进行串口通信的设备是一个具有高电平和低电平的电压信号,所以进行通讯的设备必须接地,这样才有相应的高电平和低电平产生

注意:ArduinoTX0RX1引脚如果外接了别的设备,那么在我们上传代码到Arduino时是一定会失败的(上传时用到了这两个引脚),所以我们上传时要要先把导线移除掉


在发送数据时,为了避免打断Arduino正在进行的工作,聪明的Arduino工程师选择把串口输入的数据放入Arduino的串行数据缓冲区中,等到Arduino完成工作后,就可以检测串行数据缓冲区中是否有数据,进而处理串口数据


Arduino的串口函数

  	Serial.begin(); //开启串行通信接口并设置通信波特率

    Serial.end();    //关闭通信串口

    Serial.available();//判断串口缓冲器是否有数据装入

    Serial.read();    //读取串口数据

    Serial.peek();    //返回下一字节(字符)输入数据,但不删除它

    Serial.flush();    //清空串口缓存

    Serial.print();    //写入字符串数据到串口

    Serial.println();   //写入字符串数据+换行到串口

    Serial.write();     //写入二进制数据到串口

    Serial.SerialEvent();//read时触发的事件函数

    Serial.readBytes(buffer,length);//读取固定长度的二进制流

    Serial.println(incomingByte, DEC);//打印接到数据十进制表示的ascii码。  HEX 十六进制表示

关于Arduino的串口函数详解:
Arduino - 串口操作函数与示例代码大全(转载)

Arduino - 串口操作函数与示例代码大全


接收函数Serial.read()

如果串行数据缓冲区有数据,这个函数会读取串行数据缓冲区的第一个字节,数据读取位置移动到下一个数据缓冲区,也就是说如果继续读取的话会读取下一个数据缓冲区的第一个字节.
如果数据缓冲区没有数据,将返回-1


检测串口Serial.available()

当串行数据缓冲区中有数据时,函数Serial.available()的返回值为非0,我们可以以此为判断条件,来处理串口数据!

 if(softSerial.available())  // 如果串口缓存区中有数据
{
	......
}

串口通信例程

OpenMV寻找视野中最大的色块,并把色块的中心坐标发送给Arduino

该例程用到了软件串口
在这里插入图片描述

OpenMV代码

import sensor, image, time
import json
from pyb import UART
# For color tracking to work really well you should ideally be in a very, very,
# very, controlled enviroment where the lighting is constant...
yellow_threshold   = (55, 98, -128, 127, 23, 127)
# You may need to tweak the above settings for tracking green things...
# Select an area in the Framebuffer to copy the color settings.

sensor.reset() # Initialize the camera sensor.
sensor.set_pixformat(sensor.RGB565) # use RGB565.
sensor.set_framesize(sensor.QQVGA) # use QQVGA for speed.
sensor.skip_frames(10) # Let new settings take affect.
sensor.set_auto_whitebal(False) # turn this off.
clock = time.clock() # Tracks FPS.

uart = UART(3, 115200)

# 在视野中找到最大的一个色块
def find_max(blobs):
    max_size=0
    for blob in blobs:
        if blob.pixels() > max_size:# blob.pixels()返回从属于色块(int)一部分的像素数量。
            max_blob=blob
            max_size = blob.pixels()
    return max_blob
    
while(True):
    clock.tick() # Track elapsed milliseconds between snapshots().
    img = sensor.snapshot() # Take a picture and return the image.

    blobs = img.find_blobs([yellow_threshold])
    
    if blobs:
        print('视野中的色块数sum : %d'% len(blobs))
        data=[]
        
        # 寻找视野中最大的色块
        max_blob=find_max(blobs)
        
        # 框出最大的色块,并在中心画十字
        img.draw_rectangle(max_blob.rect()) # rect
        img.draw_cross(max_blob.cx(), max_blob.cy()) # cx, cy
        
        # 将最大色块的中心坐标加在传输数组data[]后
        data.append( (max_blob.cx(),max_blob.cy()) )

        #{(1,22),(-3,33),(22222,0),(9999,12),(0,0)}
        data_out = json.dumps(set(data))    # ujson.dumps(obj):返回表示为JSON字符串的 obj 。
                                            # set() 函数创建一个无序不重复元素集
        
        uart.write(data_out +'\n')
        
        print('you send:',data_out)
    
    
    else:
        print("not found!")


Arduino代码

#include <SoftwareSerial.h>

//设置软件串口
SoftwareSerial softSerial(10, 11); // RX, TX
typedef struct
{
  int data[50][2] = {{0,0}};
  int len = 0;
}List;
List list;

void setup() 
{
  // put your setup code here, to run once:
  softSerial.begin(115200); // 设置软件串口波特率,必须与OpenMV中的一致
  Serial.begin(115200); // 设置波特率
}

void loop() 
{
  if(softSerial.available())  // 如果串口缓存区中有数据
  {
    getList();  // 将数据存储到结构体的数组list.data[][]中
    for (int i=0; i<list.len; i++)  //  遍历结构体数组
    {
      Serial.print(list.data[i][0]);    // 打印中心的x坐标cx()
      Serial.print('\t'); // 打印制表符  
      Serial.println(list.data[i][1]);  //打印中心的y坐标cy()
    }
    Serial.println("============");
    clearList();  //清空内存
  }

}


String detectString() // 判断传入的字符串能否被接收
{
  // 我们传入的数据形式 you send: {(90, 101)}
  while(softSerial.read() != '{');  // 如果数据不以'{'开头,那么我们会一直进入死循环

  //返回"{}"中的字符串
  return(softSerial.readStringUntil('}'));
                                          // readStringUntil函数可用于从设备接收到的数据中读取信息。读取到的数据信息将以字符串形式返回
                                          // 当函数读取到终止字符后,会立即停止函数执行。此时函数所返回的字符串为”终止字符”前的所有字符信息
}


void clearList()//清空内存
{
  memset(list.data, sizeof(list.data),0);
  list.len = 0;
}

void getList()  // 重点是把数据存储在结构体中的数组list.data[][]中!
{
  String s = detectString();// 将返回的字符串({}中的元素)赋值给s
                      
  // 此时s中的数据形如:(90, 101)
  String numStr = "";
  for(int i = 0; i<s.length(); i++) // 遍历刚刚返回的字符串"s"
  {
    if(s[i]=='(') // 读到开头
    {
      numStr = "";
    }
    else if(s[i] == ',')  // 读到数据分割标记','
    {
      // toInt()将有效字符串转换为整数。输入字符串应以整数开头。如果 String 包含非整数,则该函数将停止执行转换。
      list.data[list.len][0] = numStr.toInt();  // 将刚刚拼接好的数据str(色块的cx())用toInt函数转换成整形,存储在结构体数组list.data[list.len][0]中
      
      numStr = "";  // 清空numstr,方便接受','后的另一组数据
    }
    else if(s[i]==')') // 读到结尾
    {
      list.data[list.len][1] = numStr.toInt();  // 将刚刚拼接好的数据str(色块的cy())用toInt函数转换成整形,存储在结构体数组list.data[list.len][1]中
      numStr = "";
      list.len++; // 长度+1,读取下一组坐标数组
    }
    else  // 读到数据
    {
      numStr += s[i]; // 相当于把读到的数字(此时为char型)按顺序拼接到numstr后
    }
  }
}


注意:对于不同的数据,我们只需要更改String detectString()void getList()中的判断条件即可

结果:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenMV与Arduino通信—串口 的相关文章

  • VSCode 上的 PlatformIO 未编译:collect2.exe:错误:ld 返回 1 退出状态

    我最近不得不擦拭我的计算机 在一切准备就绪并运行之后 是时候打开我之前正在处理的一些 ESP32 程序了 发现 VSCode 上的 Platform IO 将不再编译 运行编译器后 我收到以下错误 Compiling pio build e
  • 如何在Arduino上将int转换为字符串?

    如何转换 int n 到一个字符串 以便当我通过串行发送它时 它作为字符串发送 这是我到目前为止所拥有的 int ledPin 13 int testerPin 8 int n 1 char buf 10 void setup pinMod
  • 批处理文件:从串口接收数据并将其写入txt文件

    我正在尝试通过 USB 串行端口从 Arduino 提取一些数据并将其写入 txt 文件 因此 我使用批处理文件 Windows 7 普通cmd 它发送例如 d 从 Arduino 请求所需的数据 收到 d 后 Arduino 开始向 PC
  • Arduino:字符串到整数得到奇怪的值

    我想转换一个String to an int 我所能找到的就是你必须将 String 转换为 char 数组 然后将该数组转换为int 但我的代码产生奇怪的值 我无法弄清楚问题是什么 void ledDimm String command
  • 蓝牙 HC-05 发送错误 1F 仅适用于 INQ 命令

    我的新蓝牙 HC 05 模块有问题 在 AT 模式下 它可以与我需要的所有命令完美配合 除了 INQ 我已经尝试事先发送一大堆其他命令 AT INIT OK AT ORGL OK AT ROLE 1 OK AT CLASS 0 OK 他们都
  • PySerial 从 Arduino 读取线路的延迟

    我正在使用带有基本 DigitalReadSerial 设置的 arduino uno 如下所述 http arduino cc en Tutorial DigitalReadSerial http arduino cc en Tutori
  • C++ Linux (Ubuntu) 正确写入串行(对于 Arduino)

    我想知道是否有一种标准方法可以与高效的串行设备进行通信 我应该使用标准库吗 如果有 是哪一个 现在我正在摆弄让 LED 根据输入的数字以给定的量亮起 Arduino 代码如下 只是练习一些东西 看我过于简单且低效的测试 include
  • Arduino从SD卡读取最后一行

    我对 Arduino 业务还很陌生 如何从 SD 卡读取最后一行 通过以下代码片段 我可以读取第一行 n 之前的所有字符 现在我想添加一个 向后 声明 或其他内容 到目前为止我的代码 include
  • Arduino - 高效地迭代 C 数组

    我有以下数组 PROGMEM prog uint16 t show hide info 4216 8900 4380 580 500 600 500 580 1620 580 500 600 500 580 500 600 480 600
  • AVRDUDE Android Arduino ioctl 错误

    我之前的问题 Android 无法使用 AVRDUDE 与 Arduino 通信 https stackoverflow com questions 15596376 android cannot talk to arduino using
  • ESP8266 I2C从机不确认数据

    我有一个 TM4C123 处理器作为 I2C 主处理器 一个 ESP8266 作为从处理器 对于 ESP 我使用的是 Arduino IDE 并在 2 5 2 版安装了 ESP8266 支持 它应该支持 I2C 从模式 但是 我无法让它工作
  • 使用 SPIFFS 加载文件时出现问题 (ERR_CONTENT_LENGTH_MISMATCH)

    好吧 这两天我一直在研究这个问题 但我仍然觉得我一无所获 我最近开始使用SPIFFS 文件系统 for Arduino开发于呼扎 ESP8266像FSBrowser ino例如 虽然它在分离代码方面非常出色 但随着我的代码不断增长 它在稳定
  • 如何使用GSM模块SIM800和Arduino Uno发送短信?

    我正在尝试通过 SIM800 GSM 模块从 Arduino 发送短信 消息到达给定号码 但格式不正确 它显示 消息格式不支持 我在这里添加了我的代码 非常感谢您的快速回复 include
  • 在 Arduino 上将整数/小数转换为十六进制?

    如何将整数或小数变量转换为十六进制字符串 我可以做相反的事情 将十六进制转换为整数 但我无法找出其他方法 这是为了Serial print 数组中的十六进制值 查看 Arduino 字符串教程here http arduino cc en
  • 如何提高 PySerial 读取速度

    我目前正在构建一台使用 Arduino Mega2560 作为主控制器的机器 Arduino 通过串口连接 获取命令 执行它并每 1ms 吐出一堆测量数据 我有一个运行 Python 的 Raspberry Pi 为用户提供一个漂亮的 GU
  • 通过iPhone音频插孔读取数据

    我正在寻找一种方法来读取通过 iPhone 的音频插孔从 Arduino 发送的原始数据 我搜索了很多并发现this https github com sanjibahmad Is Headphone Plugged In tree mas
  • 编译器:如果条件始终为真/假怎么办

    我想到了条件和编译器 我正在为 Arduino 编写一个应用程序 因此我需要该应用程序尽可能快 在我的代码中我有这个 define DEBUG false if DEBUG String pinName pinName Pin pinNam
  • Arduino串口数据解析

    我正在编写一个应用程序 通过蓝牙用我的 Android 手机控制我的机器人 一切都很顺利 数据得到回显和验证 但我在协议方面遇到了一些问题 特别是我希望我的机器人的轮子在我发送时转动一个命令 例如s 10 100 or s 30 10 数值
  • 如何使用基于HM-10蓝牙模块的BLE Shield?

    我是 arduino 项目的新手 我想请你帮忙 我从 http imall iteadstudio com development platform arduino shields im130704001 html http imall i
  • 无法将 minicom 的输出保存到文件中

    当我使用Minicom从串口捕获数据时 我需要将大数据保存到一个文件中 名为minicom cap 但是 如果我按 Ctrl A 和 L 来捕获文件 则失败 没有创建文件 minicom cap之前并不存在 我的下载目录已正确创建 我的操作

随机推荐

  • 使用SSH远程连接工具(MOBAXTERM)连接虚拟机时输入中文乱码问题

    使用SSH远程连接工具连接虚拟机时输入中文乱码问题 一 xff1a 出现的中文输入问题 二 xff1a 造成的可能原因和出现原因的环境 出现原因的环境 xff1a 本机环境win10 xff0c 虚拟机环境centos7 出现这样情况的可能
  • vscode的alt+b失效解决

    1 先安装插件 xff0c 如下 2 一共有两种方式打开浏览器 xff0c 一个是alt 43 b xff0c 还有一个是alt 43 shift 43 b 但是对于刚安装上open in browser插件 xff0c alt 43 b是
  • 解决ERROR 2003 (HY000): Can’t connect to MySQL server on ‘localhost’ (10061)

    如何解决ERROR 2003 HY000 Can t connect to MySQL server on localhost 10061 1 登录到安装Mysql的主机 xff0c 打开cmd命令行工具 xff0c 执行命令mysql u
  • vscode中converting to execution character set: Illegal byte sequence

    我的这个问题是由于之前跟博主安装的时候在tasks json文件中添加了 34 fexec charset 61 GBK 34 删除后便可以正常运行了 当时即使我没添加这个代码控制台也没出现乱码的情况 xff0c 但还是加上了 xff0c
  • 工作日志day04

    再次安装虚拟机时常见的不确定点 软件选择 安装位置 点击完成 设置用户名的时候可能与数字 xff0c 以及强度有关 注销以管理员身份登录填写root用户名和自己设的密码 网络设置之后可以ping通 sudo yum y install tr
  • linux

    目录 基本命令 文件和用户管理 用户 创建用户 删除用户 修改用户属性 用户组 创建组 组的类型 提权 用户的权限 基本权限UGO 权限的三类对象 权限的三种类型 设置权限 编写程序 增加执行权限 更改属主 xff0c 属组 基本权限ACL
  • 机器学习.

    目录 一 机器学习概述 1 1人工智能概述 1 2什么是机器学习 1 2 1定义 1 2 2解释 1 2 3数据集的构成 1 3机器学习算法分类 1 3 1总结 1 3 2机器学习算法分类 1 4机器学习开发流程 1 5学习框架和资料介绍
  • NMEA-0813协议报文解析(QT/C++)

    文章目录 一 协议说明 二 具体实现 1 GNRMC 2 GNGGA 总结 一 协议说明 34 GN 34 联合模式协议头 xff1b 34 GP 34 GPS模式协议头 xff1b 34 GL 34 GLONASS模式协议头 xff1b
  • 寄存器位设置

    作为嵌入式工程师 xff0c 一定要掌握寄存器的控制 xff0c 想要了解基本的寄存器控制 xff0c 最简单的方法就是使用单片机练手 xff0c 51 xff0c stm0 xff0c stm8 xff0c MSP430等 xff0c 与
  • STM32 —— STM32 的串口通信

    STM32 STM32 的串口通信 STM32的串口通信接口有两种 xff0c 分别是 xff1a UART 通用异步收发器 USART 通用同步异步收发器 而对于大容量 STM32F10x 系列芯片 xff0c 分别有 3 个 USART
  • STM32 —— 串口数据接收

    STM32 串口接收数据 我们已经在前面的博客中讲过了串口通信中发送数据和中断的一些基本原理 xff0c 这里主要介绍串口接收数据的相关内容 定长字符串的接收 当接收单字节时 xff0c 我们就可以使用最简单的接收方式即可 xff0c 这种
  • 远距离WiFi模块,无人机传输技术,无线通信视频传输技术

    随着科技的发展 xff0c 无人机应用范围的不断扩展且愈加广泛 无人机的起飞 xff0c 航行 xff0c 悬停 xff0c 返回的任何一个阶段 xff0c 都需要进行无线遥控 xff0c 这就需要很高的灵敏度了 同时在无人机飞行的过程中
  • OpenMV:14巡线小车

    文章目录 追小球的小车巡线小车 这个例子展示了在OpenMV Cam上使用get regression xff08 xff09 方法获得ROI的线性回归 使用这种方法 xff0c 可以轻松让机器人跟踪所有指向相同大致方向的线 本例程可以用于
  • OpenMV:16神经网络

    文章目录 导论利用神经网络进行特征识别 已停用 神经网络检测函数检测函数 96 tf classify 96 返回值加载神经网络函数 96 tf load 返回值 96 例程1 图像中央人检测例程2 整幅图像人脸检测 导论 OpenMV内置
  • OpenMV:19OpenMV4 Plus训练神经网络进行口罩识别

    文章目录 1 采集2 连接3 训练复制API KEY上传照片模型创建生成神经网络训练神经网络测试神经网络备份保存 4 下载代码分析 注意 xff1a 只有 OpenMV4 Plus可以自己训练神经网络 xff0c 其他版本的性能不够 本节讲
  • OpenMV:21控制多个舵机(需要模块PCA9685)

    文章目录 连接代码控制单个舵机的旋转pc8596 pyservo pymain py利用两个舵机拓展板控制16个舵机 今天我们来学习下 OpenMV的舵机拓展板来控制多个舵机同时使用 如果我们想控制三个以上的舵机 xff0c 就需要用到舵机
  • OpenMV:22电机扩展板控制直流电机

    文章目录 电机拓展板产品介绍代码 今天为大家讲解下 OpenMV配套的电机扩展板 我们需要自己焊接插针 在使用电机扩展板时 xff0c 我们的电机扩展板需要外接一个6V 12V的电源 xff0c 来为电机供电 xff1b 电机扩展板同时会使
  • OpenMV:23串口发送数据

    文章目录 产品Hello World简单的数据发送 本节讲解 如何使用OpenMV通过串口来发送数据 OpenMV 是可以直接通过串口发送字符串的 为什么要用串口呢 xff1f 因为要时候需要把信息传给其他MCU xff08 单片机 xff
  • HTTP AUTH验证

    何为http auth http auth是一种基础的用户验证 xff0c 原理是将用户名 密码base64加密后放在http的请求头部Authorization 发给服务器 浏览器的做法 当你访问一个需要http auth验证的资源时 x
  • OpenMV与Arduino通信—串口

    文章目录 96 Arduino 96 的串口函数接收函数 96 Serial read 96 检测串口 96 Serial available 96 串口通信例程 96 OpenMV 96 代码 96 Arduino 96 代码 所有要进行