STM32单片机/OpenMv的串口通信部分
因为博主本人是一个技术初学菜鸟,本文浅谈相关理解,方便自己记忆也分享给大家,文中的错误欢迎读者指正,欢迎交流,互相学习。 本文描述主要以openmv视角,以单片机视角的部分补充可移步参阅
为什么使用串口?
为什么要用串口呢? 因为要时候需要把信息(比如数字,坐标,参数……)传给其他MCU,串口简单,通用,基本每一个MCU都会有串口。 例如: 我想用OpenMv进行图像处理,处理完之后想让其他人去做除了OpenMv之外的事情,所以我可以把他处理出来的结果或者其他有用的信息通过串口传输给其他设备的MCU(如电脑,单片机等) openmv部分
连接方式
串口通信(TTL)至少需要3根线,RXD、TXD、GND: RXD和TXD互连,GND接地
连接约定
-
统一波特率 选定固定串口
传输数据
这里假设输出识别到的t这个对象的坐标,可使用以下两种方法:
-
Ostr="[%d,%d]" % (t.cx(),t.cy()) #方式1 Ostr=json.dumps([t.cx(),t.cy()]) #方式2
关于json对象
基本所有的语言都支持json,这里只写两个函数[编解码]:
例(python环境):
#!/usr/bin/python
import json
t = [ {
a : 1, b : 2, c : 3} ]
json = json.dumps(t)
print(json)
执行结果为:
[{
"a": 1, "b": 2, "c": 3}]
在keil环境也有了官方的库:——Jansson
转至: . 详情不再赘述
注意部分
-
OpenMv使用编程语言为Python,STM32单片机一般使用C 串口通信一般每次中断只传输1Byte,也就是说要完整传输完1帧,进中断的次数>=8 最简单的每一帧的传输至少要有帧头和数据,当然可以增加数据量、校验和,帧尾等以备其他操作 每个Byte都要以字节方式发送,而不是16进制 data = bytearray([x,y])#将x,y作为两个Byte存入data uart.write(data)#将data通过串口发送 uart.write("%x
"%x)#将x转换成16进制发送 帧头实际上就是判断数据从哪里开始的标志,一般自定义,为保证安全性,可以采用双帧头的模式, 例如: 5A 5A 10 50 1B 00 FF 63 03 0C 这里加粗的是帧头,剩下8个是数据(随便设的,仅举例用)
- 说明: Openmv也是个单片机,它的芯片其实也是STM32,底层代码也是C,只是为了方便大众,都用Python直接调用技术团队写的例程直接进行编程
