当前位置:   article > 正文

OpenMV串口通讯

openmv串口通讯

解决的问题

1.openMV串口怎么设置

2.OpenMV直接用发送函数发送不了整数,如何一次发送多组数据?

3.OpenMV不能发送大于255的整型数据怎么解决?

1.OpenMV串口设置

引入串口库或函数

from machine import UART

串口初始化与OpenMV串口引脚 

串口选择

  1. # OpenMV4 H7 Plus, OpenMV4 H7, OpenMV3 M7, OpenMV2 M4 的UART(3)是P4-TX P5-RX
  2. uart = UART(3, 115200) #OpenMV RT 注释掉这一行,用下一行UART(1)
  3. #uart = UART(1, 115200) #OpenMV RT 用UART(1)这行,注释掉上一行UART(3)
  4. # 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")

2.整型类数据发送与接收

2.1发送数据

 引入一个库

import ustruct 

构建传输数据函数 

  1. #串口发送数据
  2. def sending_data(cx,cy,cw,ch):
  3. global uart
  4. data = ustruct.pack("<bbhhhhb",#b一个字节,h是一个整型
  5. 0x2c,
  6. 0x12,
  7. cx,#数据大小不能超过一个字节也就是255
  8. cy,
  9. cw,
  10. ch,
  11. 0x5B
  12. )
  13. print(type(cx))
  14. uart.write(data)

如果输入的数据不是想要传输的类型,可以在函数里进行类型转换 

2.2.读数据

uart.read(5) # read up to 5 bytes 读取5个字节

 3.发送大于255的数据

思路将大于255的数据分成高八位和低八位分别发送

如何得到高八位和低八位?

  1. 将数据向右移动八位得到高八位数据
  2. 原有数据减去高八位就可以得到低八位
  3. while(True):
  4. a = 8
  5. a = a>>1
  6. print(a)
  7. 4
  8. 4
  9. 4
  10. 4
  11. Traceback (most recent call last):
  12. File "<stdin>", line 15, in <module>
  13. Exception: IDE interrupt
  14. OpenMV v4.4.2; MicroPython v1.19-omv-r6; OPENMV4-STM32H743
  15. Type "help()" for more information.
  16. >>>

4.OpenMV发送总代码

2024.6.2运行发现代码有bug

  1. import sensor, image, time
  2. from pyb import UART
  3. import ustruct
  4. sensor.reset()
  5. sensor.set_pixformat(sensor.RGB565)
  6. sensor.set_framesize(sensor.QVGA)
  7. sensor.set_auto_gain(False)# 自动增益开启(True)或者关闭(False)。在使用颜色追踪时,需要关闭自动增益。
  8. sensor.set_auto_whitebal(False)#关闭白平衡
  9. sensor.skip_frames(time = 2000)
  10. clock = time.clock()
  11. uart = UART(3,115200)#设置串口
  12. uart.init(115200,bits = 8, parity = None, stop = 1)#初始化串口
  13. value_black = [(0, 17, -3, 5, 14, -4)]
  14. value_white = [(45, 98, -8, 10, -6, 9)]
  15. #串口发送数据
  16. def sending_data(cx,cy,cw,ch):
  17. global uart
  18. data = ustruct.pack("<bbhhhhb",
  19. 0x2c,
  20. 0x12,
  21. cx,
  22. cy,
  23. cw,
  24. ch,
  25. 0x5B
  26. )
  27. print(type(cx))
  28. uart.write(data)
  29. #找到面积最大的色块相关函数
  30. #find_blobs()
  31. #输入寻找色块颜色阈值
  32. def find_blobs (img,color):
  33. black_blobs_list = img.find_blobs(color,x_stride = 50, y_stride = 50)
  34. if black_blobs_list:
  35. return black_blobs_list
  36. else:
  37. print("没有该颜色色块")
  38. return None
  39. #drawMaxblob()
  40. #输入寻找色块最大的那个
  41. def drawMaxblob (blobs):
  42. BlobsAreaMax = 0
  43. MaxBlobs = None
  44. if blobs:
  45. for blob in blobs:
  46. if blob[2]*blob[3] > BlobsAreaMax:
  47. MaxBlobs = blob#保存最大面积的色块
  48. BlobsAreaMax = blob[2]*blob[3]
  49. return MaxBlobs
  50. #找到最大颜色的色块并将其框起来
  51. #输出颜色块数据
  52. def find_color_MAX_blob(img,color):
  53. ObjectBlobslist = find_blobs(img,color)
  54. MaxBlob = drawMaxblob(ObjectBlobslist)
  55. if MaxBlob:
  56. img.draw_rectangle(MaxBlob.rect())
  57. img.draw_cross(MaxBlob.cx(),MaxBlob.cy())
  58. return MaxBlob.cx(),MaxBlob.cy(),MaxBlob.w(),MaxBlob.h()#返回的相关数据
  59. #处理色块数据并使用串口发送
  60. def DataProcessSendData(img,color):
  61. Data_list = find_color_MAX_blob(img,color)
  62. cx = None
  63. cy = None
  64. cw = None
  65. ch = None
  66. if Data_list:
  67. cx = Data_list[0]
  68. cy = Data_list[1]
  69. cw = Data_list[2]
  70. ch = Data_list[3]
  71. sending_data(cx,cy,cw,ch)
  72. while(True):
  73. img = sensor.snapshot()
  74. clock.tick()
  75. DataProcessSendData(img,value_black)

修改一个简洁的串口发送

  1. import sensor, image, time
  2. from pyb import UART
  3. import ustruct
  4. sensor.reset()
  5. sensor.set_pixformat(sensor.RGB565)
  6. sensor.set_framesize(sensor.QVGA)
  7. sensor.set_auto_gain(False)# 自动增益开启(True)或者关闭(False)。在使用颜色追踪时,需要关闭自动增益。
  8. sensor.set_auto_whitebal(False)#关闭白平衡
  9. sensor.skip_frames(time = 2000)
  10. clock = time.clock()
  11. uart = UART(1,115200)#设置串口
  12. uart.init(115200,bits = 8, parity = None, stop = 1)#初始化串口
  13. value_black = [(0, 17, -3, 5, 14, -4)]
  14. value_white = [(45, 98, -8, 10, -6, 9)]
  15. #串口发送数据
  16. def sending_data(cx,cy,cw,ch):
  17. global uart
  18. data = ustruct.pack("<bbhhhhb",#格式两个字节做帧头四个整型做数组一个字节做帧尾
  19. 0x2c,
  20. 0x12,
  21. cx,
  22. cy,
  23. cw,
  24. ch,
  25. 0x5B
  26. )
  27. print(type(cx))
  28. uart.write(data)
  29. while(True):
  30. img = sensor.snapshot()
  31. sending_data(cx = 0xffff,
  32. cy = 0x02,
  33. cw = 0x03,
  34. ch = 0x04)
  35. time.sleep_ms(100)

5.接收数据

 

接受代码例程

因为串口接收到的数据全部是字符类型因此需要转换

  1. #串口接收数据
  2. def ReadUartData(uart):
  3. i =0
  4. ReadUartValue = None
  5. if uart.any():
  6. data = uart.read(1)#读取一个字节
  7. ReadUartValue = ord(data)#将读取到的字符类型数据转换成整数
  8. # print(type(ReadUartValue))
  9. return ReadUartValue
  10. else:
  11. # print("没有接受到数据")
  12. # time.sleep_ms(500)
  13. return 0;

6.问题与解决

6.1.关于能不能发送大于255数据的问题

结果发送0xff时串口接收到的是0xff00,发送0xffff是接收到的是ffff

难道可以发送大于255的数据吗?我们忽略了一个问题,STM32串口接收是8位数据,一次性发送大于255的数据会导致数据丢失。因此发送大于255的数据需要我们在发送和接收代码进行修改。

6.2类型转换问题

在python中数字类的字符强制转换成整型就是字符数据的大小

比如     

  1. a = '1'
  2. b = int(a)
  3. b就是整型的1

而在c语言中字符1转换成整型还是49

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/喵喵爱编程/article/detail/935628
推荐阅读
相关标签
  

闽ICP备14008679号