赞
踩
解决的问题
1.openMV串口怎么设置
2.OpenMV直接用发送函数发送不了整数,如何一次发送多组数据?
3.OpenMV不能发送大于255的整型数据怎么解决?
from machine import UART
串口选择
- # OpenMV4 H7 Plus, OpenMV4 H7, OpenMV3 M7, OpenMV2 M4 的UART(3)是P4-TX P5-RX
- uart = UART(3, 115200) #OpenMV RT 注释掉这一行,用下一行UART(1)
- #uart = UART(1, 115200) #OpenMV RT 用UART(1)这行,注释掉上一行UART(3)
- # OpenMV RT 只有串口UART(1),对应P4-TX P5-RX; OpenMV4 H7 Plus, OpenMV4 H7, OpenMV3 M7 的UART(1)是P0-RX P1-TX
串口初始化
uart.init(115200,bits = 8, parity = None, stop = 1)#初始化串口
uart.write("hello world\r\n")
import ustruct
- #串口发送数据
- def sending_data(cx,cy,cw,ch):
- global uart
- data = ustruct.pack("<bbhhhhb",#b一个字节,h是一个整型
- 0x2c,
- 0x12,
- cx,#数据大小不能超过一个字节也就是255
- cy,
- cw,
- ch,
- 0x5B
- )
- print(type(cx))
- uart.write(data)
如果输入的数据不是想要传输的类型,可以在函数里进行类型转换
uart.read(5) # read up to 5 bytes 读取5个字节
思路将大于255的数据分成高八位和低八位分别发送
如何得到高八位和低八位?
- 将数据向右移动八位得到高八位数据
- 原有数据减去高八位就可以得到低八位
-
-
- while(True):
- a = 8
- a = a>>1
- print(a)
-
-
-
- 4
- 4
- 4
- 4
-
- Traceback (most recent call last):
- File "<stdin>", line 15, in <module>
- Exception: IDE interrupt
- OpenMV v4.4.2; MicroPython v1.19-omv-r6; OPENMV4-STM32H743
- Type "help()" for more information.
- >>>
2024.6.2运行发现代码有bug
- import sensor, image, time
- from pyb import UART
- import ustruct
- sensor.reset()
- sensor.set_pixformat(sensor.RGB565)
- sensor.set_framesize(sensor.QVGA)
- sensor.set_auto_gain(False)# 自动增益开启(True)或者关闭(False)。在使用颜色追踪时,需要关闭自动增益。
- sensor.set_auto_whitebal(False)#关闭白平衡
- sensor.skip_frames(time = 2000)
- clock = time.clock()
-
- uart = UART(3,115200)#设置串口
- uart.init(115200,bits = 8, parity = None, stop = 1)#初始化串口
- value_black = [(0, 17, -3, 5, 14, -4)]
- value_white = [(45, 98, -8, 10, -6, 9)]
-
- #串口发送数据
- def sending_data(cx,cy,cw,ch):
- global uart
- data = ustruct.pack("<bbhhhhb",
- 0x2c,
- 0x12,
- cx,
- cy,
- cw,
- ch,
- 0x5B
- )
- print(type(cx))
- uart.write(data)
-
- #找到面积最大的色块相关函数
- #find_blobs()
- #输入寻找色块颜色阈值
- def find_blobs (img,color):
- black_blobs_list = img.find_blobs(color,x_stride = 50, y_stride = 50)
- if black_blobs_list:
- return black_blobs_list
- else:
- print("没有该颜色色块")
- return None
-
-
- #drawMaxblob()
- #输入寻找色块最大的那个
- def drawMaxblob (blobs):
- BlobsAreaMax = 0
- MaxBlobs = None
- if blobs:
- for blob in blobs:
- if blob[2]*blob[3] > BlobsAreaMax:
- MaxBlobs = blob#保存最大面积的色块
- BlobsAreaMax = blob[2]*blob[3]
- return MaxBlobs
- #找到最大颜色的色块并将其框起来
- #输出颜色块数据
- def find_color_MAX_blob(img,color):
- ObjectBlobslist = find_blobs(img,color)
- MaxBlob = drawMaxblob(ObjectBlobslist)
- if MaxBlob:
- img.draw_rectangle(MaxBlob.rect())
- img.draw_cross(MaxBlob.cx(),MaxBlob.cy())
- return MaxBlob.cx(),MaxBlob.cy(),MaxBlob.w(),MaxBlob.h()#返回的相关数据
- #处理色块数据并使用串口发送
- def DataProcessSendData(img,color):
- Data_list = find_color_MAX_blob(img,color)
- cx = None
- cy = None
- cw = None
- ch = None
- if Data_list:
- cx = Data_list[0]
- cy = Data_list[1]
- cw = Data_list[2]
- ch = Data_list[3]
- sending_data(cx,cy,cw,ch)
- while(True):
- img = sensor.snapshot()
- clock.tick()
- DataProcessSendData(img,value_black)
修改一个简洁的串口发送
- import sensor, image, time
- from pyb import UART
- import ustruct
- sensor.reset()
- sensor.set_pixformat(sensor.RGB565)
- sensor.set_framesize(sensor.QVGA)
- sensor.set_auto_gain(False)# 自动增益开启(True)或者关闭(False)。在使用颜色追踪时,需要关闭自动增益。
- sensor.set_auto_whitebal(False)#关闭白平衡
- sensor.skip_frames(time = 2000)
- clock = time.clock()
-
- uart = UART(1,115200)#设置串口
- uart.init(115200,bits = 8, parity = None, stop = 1)#初始化串口
- value_black = [(0, 17, -3, 5, 14, -4)]
- value_white = [(45, 98, -8, 10, -6, 9)]
-
- #串口发送数据
- def sending_data(cx,cy,cw,ch):
- global uart
- data = ustruct.pack("<bbhhhhb",#格式两个字节做帧头四个整型做数组一个字节做帧尾
- 0x2c,
- 0x12,
- cx,
- cy,
- cw,
- ch,
- 0x5B
- )
- print(type(cx))
- uart.write(data)
-
- while(True):
- img = sensor.snapshot()
- sending_data(cx = 0xffff,
- cy = 0x02,
- cw = 0x03,
- ch = 0x04)
- time.sleep_ms(100)
接受代码例程
因为串口接收到的数据全部是字符类型因此需要转换
- #串口接收数据
-
- def ReadUartData(uart):
- i =0
- ReadUartValue = None
- if uart.any():
- data = uart.read(1)#读取一个字节
- ReadUartValue = ord(data)#将读取到的字符类型数据转换成整数
- # print(type(ReadUartValue))
- return ReadUartValue
-
- else:
- # print("没有接受到数据")
- # time.sleep_ms(500)
- return 0;
结果发送0xff时串口接收到的是0xff00,发送0xffff是接收到的是ffff
难道可以发送大于255的数据吗?我们忽略了一个问题,STM32串口接收是8位数据,一次性发送大于255的数据会导致数据丢失。因此发送大于255的数据需要我们在发送和接收代码进行修改。
在python中数字类的字符强制转换成整型就是字符数据的大小
比如
- a = '1'
- b = int(a)
- b就是整型的1
而在c语言中字符1转换成整型还是49
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。