OpenMV串口通讯详解

简介: OpenMV串口通讯详解

材料准备

需要准备材料,四根杜邦线,一个USB转TTL模块(冤大头可以买官方串口调试模块),一根安卓数据线(注意:是数据线,不是充电线,有些充电线不能进行数据传输)。


上面是我买的Usb转TLL模块,VCC接VIN,GND接GND,TXD接P5,RXD接P4。

官方示例代码解析

之后就是代码介绍。

import time
from pyb import UART
# Always pass UART 3 for the UART number for your OpenMV Cam.
# The second argument is the UART baud rate. For a more advanced UART control
# example see the BLE-Shield driver.
uart = UART (3, 19200)
while(True):
    uart.write("Hello World!\r")
    time.sleep_ms(1000)


UART()函数介绍

上面是OpenMV IDE中的官方示例,用于OpenMV发送数据。因为OpenMV只引出来串口3,所以必须是UART(3,x)。x 是波特率,可更改。


usart.write()函数介绍

usart.write():发送一个字节出去。可以理解为stm32串口重映射的时候,用printf发送数据。


time.sleep_ms(x)函数介绍

time.sleep_ms(x):x为延时的时间,单位为毫秒。此处延时1000毫秒,也就是1秒。


自己写的代码加深理解

我在此写了一个函数,意思是只有上位机发送字符‘0’的时候,OpenMV才可以向上位机发送一次数据。

import time
from pyb import UART
uart = UART(3, 9600)  #初始化串口3,波特率为9600(注意:上位机记得也配置成9600)
while(True):
    if uart.any():                          #判断是否接收到数据
        a = uart.read(1).decode()           #uart.read()为一个字节串,加.decode() 变成字符串
        print(a)                            #在OpenMV的串行终端中打印
        if a == '0':                        #如果接收达字符0
            b = 1
            print('OK')                     #在串行终端中显示OK
        elif b==1:     
            uart.write("Hello World!\r")    #向上位机发送数据
            uart.write(a)
            b=0


usart.any()介绍

首先,我们分析函数usart.any()。作用就是,判断OpenMV是否接收到了数据。如果接收到了数据,那么接收到几个数据,就返回几(比如接收到2个字符,返回2。接收到一个字符,返回1)。没有接收到数据返回0。与stm32的USART_GetITStatus()函数类似。不过这里不需要传入参数。


这个时候有人会有疑惑了。感觉这个usart.any()作用也不大呀。但是,起始这样可以加快其他程序的运行效率。比如说,如果我们除了串口收发程序,还需要进行人脸识别。如果没有usart.any(),那么每次程序都需要浪费时间多进行一下操作。这些没有意义的操作,会影响程序运行。

        a = uart.read(1).decode()  #uart.read()为一个字节串,加.decode() 变成字符串
        print(a)
        if a == '0':
            b = 1
            print('OK')
        elif b==1:
            uart.write("Hello World!\r")
            uart.write(a)
            b=0


uart.read()介绍

uart.read([nbytes])可以接收字符,如果我们直接使用uart.read,那么他就会将所有接收到的字符全部读取。如果设置了nbytes,他就可以设置接收到的字节数量。


但是,我们直接写 a = uart.read(1),是不可行的。如果这么写会出现你上位机明明发送了一个字符‘0’,之后你再发送除‘0’以外的其他字符,会发现上位机并没有Hello World!。这是为什么呢?因为uart.read(1)返回的是一根字节串。那么程序 if a == '0':也就一直不成立,b永远无法等于1,导致上位机不可能接收到数据。所以我们需要写成a = uart.read(1).decode()即可


import time
from pyb import UART
uart = UART(3, 9600)
b=0
while(True):
    if uart.any():
        a = uart.read(1) #uart.read()为一个字节串,加.decode() 变成字符串
        print(a)
        if a == '0':
            b = 1
            print('OK')
        elif b==1:
            uart.write("Hello World!\r")
            uart.write(a)
            b=0


总结

这个时候,你会说我还几个函数没有啊。其实那几个都差不多,我们只需要掌握uart = UART(3, 9600)进行初始化;uart.any()判断是否有数据接收;uart.read()接收数据;uart.write()发送数据,这四个函数即可。


只要掌握了这四个函数,我们就能利用OpenMV很好的与单片机进行交互。


最后,说明一下,我使用的是野火的串口助手。遇到了一个问题,uart.readline()是读取一行数据。我尝试下面代码,用野火的串口助手发送”123“,发现串行终端的数据是


1


2


3


说明野火的串行助手发送的123,OpenMV并没有识别成一行数据。所以我建议少用uart.readline()  。建议使用a = uart.read(1).decode(),这样防止出现异议。反正我们与OpenMV进行交互,一个字符控制就行。比如像我上面写的,0表示单片机开始发送有用数据。


a=uart.readline()  
print(a)
目录
相关文章
|
9月前
esp32s3实现openmv
esp32s3实现openmv
165 0
|
9月前
串口通信如何控制步进电机转动?
串口通信如何控制步进电机转动?
154 3
|
9月前
一款带键扫的LED驱动电路
一、基本概述 TM1628A是一种带键盘扫描接口的LED(发光二极管显示器)驱动控制专用IC,内部集成有MCU数字接口、数据锁存器、LED 驱动、键盘扫描等电路。本产品质量可靠、稳定性好、抗干扰能力强。主要适用于家电设备(智能热水器、微波炉、洗衣机、空调、电磁炉)、机顶盒、电子称、智能电表等数码管或LED显示设备。 二、特性说明 采用CMOS工艺 多种显示模式(10 段×7 位 ~ 13段×4 位) 最大支持矩阵按键10×2 辉度调节电路(8 级占空比可调) 串行接口(CLK,STB,DIO) 振荡方式:内置RC振荡 内置上电复位电路 内置数据锁存电路 内置针对LED反偏
|
编解码 网络性能优化 芯片
如何用51单片机实现pwm调光+呼吸灯(超详细+源码)
如何用51单片机实现pwm调光+呼吸灯(超详细+源码)
1126 0
如何用51单片机实现pwm调光+呼吸灯(超详细+源码)
|
安全 IDE 开发工具
了解有源和无源蜂鸣器的区别以及如何在Arduino中使用它
在本文中,我们将探索蜂鸣器的内部结构,检查其内部结构,并对其工作系统有更深入的了解。在这里,我们讨论一下有源蜂鸣器和无源蜂鸣器的区别。该设备的主要功能是将电信号转换为音频声音。蜂鸣器可分为有源蜂鸣器和无源蜂鸣器两种不同类型,它们都是极化的。
2710 0
|
开发工具 计算机视觉 git
OpenMV图像处理之后给单片机通讯
OpenMV图像处理之后给单片机通讯
345 1
|
Python
使用proteus实现51单片机的串口通讯仿真
使用proteus实现51单片机的串口通讯仿真
669 0
|
机器学习/深度学习 文字识别 IDE
初识OpenMV
初识OpenMV
840 0
蓝桥杯之单片机学习(二)——蜂鸣器与继电器的基本控制
蓝桥杯之单片机学习(二)——蜂鸣器与继电器的基本控制
430 0
蓝桥杯之单片机学习(二)——蜂鸣器与继电器的基本控制

热门文章

最新文章