项目需求背景
在诸如电赛、智能车、工训赛等电子竞赛中需要使用多个处理设备处理传感器的数据并进行信息交互。如无人机赛项中,大概会用到三个或以上处理设备
设备型号 | 作用 |
---|---|
stm32f407zet6 | 整合所有信息进行飞行控制 |
stm32f103c8t6 | 专用于接收激光雷达串口信息并进行解析 |
stm32f429igt6 | 与飞控实现双向通信,整合其他处理设备信息,外部io实现舵机控制,连接无线通讯模块供地面端观察 |
树莓派 | 连接摄像头运行识别代码 |
通讯协议设置
考虑数据结构简单且全双工的需求,使用uart进行通信
各设备之间的通信协议如下
第1位 | 2 | …… | n |
---|---|---|---|
A | 保留位 | 数据 | F |
即以A为帧头,F为帧尾,保留位在飞控与igt6之间时表示该信息出自上游的设备号,在igt6与树莓派之间时表示传输的识别结果物品编号,在igt6与c8t6及无线通信串口之间时表示数据位数(符合要求的雷达点数可能有多个,需要传输的数据也有多个)
代码示例
树莓派(pythpn)
在树莓派中python识别出目标图形获得坐标后传输一帧信息
#串口配置
ser = serial.Serial('/dev/ttyAMA0', 115200, timeout = 0.005)
#数据发送
ser.write('A'.encode())
ser.write(area_no.encode())#分别为1234区 返回1234
ser.write(dx.encode())
ser.write(dy.encode())
ser.write('F'.encode())
#数据接收
msgnow = ser.read().decode()
if msgnow == 'A' and state == 0:#接收帧头
msg = msg + msgnow
state = 1
elif msgnow == 'F'and state == 1:#接收帧尾并复位
state = 0
msg = msg + msgnow
recover = 1
else:
msg = msg + msgnow
stm32(C语言)
32中接收信息,使用cubmx配置后调用HAL库实现串口回调函数的编写
void recstring1(uint8_t data)//串口一接收函数
{
//HAL_UART_Transmit_IT(&huart3,&recindex1,1);
if(state1 ==0&&data==0x41)
{
allstring1[recindex1] = data;
recindex1++;
state1=1;
}
else if(state1==1&&data==0x46)
{
allstring1[recindex1] = data;
recindex1++;
allstring1[recindex1] = '\0';
state1 = 0;
recindex1 = 0;
recover1 = 1;
}
else if(state1 == 1&&data!=0x00)
{
allstring1[recindex1] = data;
recindex1++;
}
else if(state1 == 1&&data==0x00)
{
allstring1[recindex1] = 0x30;
recindex1++;
}
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance==USART1)//如果是串口一接收到数据(飞控)
{
recstring1(UART1_Rx_Buf[0]);
HAL_UART_Receive_IT(&huart1, (uint8_t *)&UART1_Rx_Buf, 1);
}
}
//发送部分
datastr[0] = 'A';
datastr[1] = '2';
datastr[2] = '0';//该任务为修改定高信息
datastr[3] = usart_data_handle.height[0];
datastr[4] = usart_data_handle.height[1];
datastr[5] = usart_data_handle.height[2];
datastr[6] = 'F';
UART_Transmit_string(&huart2);