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模块(一个大概五六元),两个模块之间连线进行通信。
注意事项:
- 串口通信两方制定好通信协议,最好写出一份协议手册
- 串口通信最好指定发送的数据长度,方便接收方进行数据解码
- 串口通信最好指定特殊的头帧和尾帧,用以进行数据对齐和纠错
- 串口通信最好指明一个命令位,用以区分不同数据的不同用途
- 使用串口时,如果没有默认给予串口权限,一律需要使用sudo最高权限运行程序或串口调试助手
- 可以使用
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位停止位完成串口任务
- 使用代码打开一端串口,以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
其他依次类推
- 使用串口调试助手打开一端串口,以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 | 字符’!’ |