这一篇博客主要是讲一下openmv的串口通信,我之前发了一篇openmv的库函数的博客,那里面有讲到一些,但是还是太浅显,所以写一篇详细的:
一.调用
如果你要使用串口,那么首先要打开串口,就必须要在函数开头添加以下代码
import pyb
from pyb import UART
这两行代码让你拥有了串口的使用权,接下来你就要对串口进行配置
uart=UART(3,115200)
可以看到括号中有两个参数分别是3和115200
其中3是我所配置的串口号,115200为波特率
注意:OpenMV RT 只有串口UART(1),对应P4-TX P5-RX。
OpenMV4 H7 Plus, OpenMV4 H7, OpenMV3 M7 的串口UART(1)是P0-RX P1-TX。
OpenMV4 H7 Plus, OpenMV4 H7, OpenMV3 M7, OpenMV2 M4 的串口UART(3)是P4-TX P5-RX
二.实例
下面我用一个apriltag标签测距的代码来给大家分析
def find_apriltag_ceju():
img = sensor.snapshot()
for tag in img.find_apriltags(fx=f_x, fy=f_y, cx=c_x, cy=c_y): # 默认为TAG36H11
img.draw_rectangle(tag.rect(), color = (255, 0, 0))
img.draw_cross(tag.cx(), tag.cy(), color = (0, 255, 0))
print_args = (tag.x_translation(), tag.y_translation(), tag.z_translation(), \
degrees(tag.x_rotation()), degrees(tag.y_rotation()), degrees(tag.z_rotation()))
# 位置的单位是未知的,旋转的单位是角度
#print("Tx: %f, Ty %f, Tz %f, Rx f, Ry %f, Rz %f" % print_args)
x=k*tag.z_translation()
x1=abs(x)
#x2=int(x1)
x_bytes = struct.pack('<f', x1) # '<f' 表示小端字节序的单精度浮点数 # 创建一个包含特定字节的bytearray,包含x_bytes的字节
data=bytearray([0x4D,0x56,4]) + bytearray(x_bytes) + bytearray([0x21,0x3B])
uart.write(data)
print(x1,"cm")
sensor.skip_frames(5)
因为x本身是一个浮点型的数,然而串口发送数据只能发送字节,所以我在函数中定义了x1=abs()取绝对值,然后将整型拆分为两个字节发送给单片机。
x_bytes = struct.pack('<f', x1) # '<f' 表示小端字节序的单精度浮点数 # 创建一个包含特定字节的bytearray,包含x_bytes的字节
struct.pack用于将Python的值根据格式符,转换为字符串(因为Python中没有字节(Byte)类型,可以把这里的字符串理解为字节流,或字节数组)。其函数原型为:struct.pack(fmt, v1, v2, …),参数fmt是格式字符串,关于格式字符串的相关信息在下面有所介绍。v1, v2, …表示要转换的python值。
三.其他
大家基础的可以去星瞳科技的官网入门教程中进行学习,里面也有串口通信的课程,完整的学习完之后基本能看懂大部分openmv的代码。ψX60wYYcaqWiN25Rψ