电科2023夏令营视觉组学习内容3-串口部分

LIMITI_SUMMER_CAMP_CV

github:GitHub - Zzzingzzz/LIMITI_SUMMER_CAMP_CV: 2023电子科技大学LIMITI机器人队夏令营视觉组线上学习内容

2023电子科技大学LIMITI机器人队夏令营视觉组线上学习内容,基于2022年视觉组经验编写

夏令营培训3——串口

注:该串口库为2022年使用的老版本,2024年更新的串口库见GitHub - Zzzingzzz/Uart_Library: 串口库

  • 串口作用:主要作用为数据通信。在处理完图像数据后,得到的识别和定位信息只是存放在我们电脑的代码中,需要通过串口通信发送至电控所控制的单片机里,从而告知电控我们提取到的信息,方便电控进行后续机器人的控制。

请自行查阅串口通信原理,尤其掌握以下几个参数:

  • 波特率:常用波特率有9600、19200、38400、57600以及115200等,根据实际情况选择
  • 数据位:可选择5、6、7、8位,其中8位数据位是最常用的
  • 校验位:可选择奇校验、偶校验或者无校验位
  • 停止位:可选择1、1.5、2位,其中默认为1位

推荐使用Vofa+或Cutecom串口调试助手进行串口调试

可以先自行购买两个CH340 USB转TTL模块(一个大概五六元),两个模块之间连线进行通信。

注意事项:

  1. 串口通信两方制定好通信协议,最好写出一份协议手册
  2. 串口通信最好指定发送的数据长度,方便接收方进行数据解码
  3. 串口通信最好指定特殊的头帧和尾帧,用以进行数据对齐和纠错
  4. 串口通信最好指明一个命令位,用以区分不同数据的不同用途
  5. 使用串口时,如果没有默认给予串口权限,一律需要使用sudo最高权限运行程序或串口调试助手
  6. 可以使用ls -l /dev/ttyUSB*查看接入电脑的串口设备

任务1:熟悉代码模板

请仔细阅读串口模板程序,熟悉main.cpp中串口库调用方法,并熟悉Uart.hpp中串口各种定义,明白Uart.cpp中系统串口的调用方法

将两个USB转TTL模块之间连线,并同时接入电脑。

main.cpp中开启了读串口和写串口双线程

  • 读串口

使用uart.ReadBuffer()函数从串口中读取数据到读串口缓冲区数组uart.readBuff

  • 写串口

先给写串口缓冲区数组uart.writeBuff数组赋值,再使用uart.WriteBuffer()函数将uart.writeBuff数组写入到串口

注:若要将位数大于8位的数据类型拆分为uint8_t并赋值发送至串口,可以使用memcpy函数,具体使用可以参考串口模板

请实现以下两个功能

默认以波特率115200,8位数据位,无奇偶校验位,1位停止位完成串口任务

  1. 使用代码打开一端串口,以10Hz频率、如下表数据格式发送数据;使用串口调试助手打开另一端串口,接收并查看数据

数据总长度为10个8位字节

头帧1 头帧2 命令位 第4位 第5-6位 第7-8位 第9位 尾帧
字符’?’ 字符’!’ 字符’S’ uint8_t flag1 uint16_t X uint16_t Y uint8_t flag2 字符’!’

若flag1=2,X=3000,Y=2500,flag2=3,则发送和接收的10位数据均应如下

以十六进制显示:
0x3f 0x21 0x53 0x02 0xb8 0x0b 0xc4 0x09 0x03 0x21
注:
0x3f = '?'
0x21 = '!'
0x53 = 'S'
0xb8 0x0b 是用memcpy函数拆分后的 X=3000
其他依次类推
  1. 使用串口调试助手打开一端串口,以10Hz频率,相同数据格式发送数据;使用代码打开另一端串口,接收该数据,并解码为flag1、X、Y、flag2

任务2:更改协议

以波特率9600,8位数据位,无奇偶校验位,1位停止位完成串口任务

  • 更改数据格式为如下表

数据总长度为16个8位字节

头帧1 头帧2 命令位 第4-7位 第8-11位 第12-15位 尾帧
字符’?’ 字符’!’ 字符’D’ int32_t X int32_t Y int32_t Z 字符’!’

尝试更改不同的X,Y,Z值,分别实现发送和接收该数据

具体实现可参照任务1中需要实现的两个功能

任务3:结合图像识别

请结合opencv学习中的内容,实现以下任务

  • 利用摄像头实时提取出当前图像中面积最大的红色区域,并获取该区域的中心点像素坐标x,y,以如下表数据格式实现串口发送并接收实时数据

数据总长度为12个8位字节

头帧1 头帧2 命令位 第4-7位 第8-11位 尾帧
字符’?’ 字符’!’ 字符’A’ int32_t X int32_t Y 字符’!’
1 个赞