自定义简单通信协议实现基于UART的多设备通信

项目需求背景

在诸如电赛、智能车、工训赛等电子竞赛中需要使用多个处理设备处理传感器的数据并进行信息交互。如无人机赛项中,大概会用到三个或以上处理设备

设备型号作用
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);	
  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Vivado 是一种集成设计环境,用于进行FPGA和SoC的设计和开发。在 Vivado 中实现 UART 串口通信需要进行以下几个步骤: 1. 创建工程:在 Vivado 中创建一个工程,并选择目标设备。 2. 添加模块:创建一个新的 Verilog 或 VHDL 模块来实现 UART 通信功能。这个模块将负责处理 UART 协议,并与其他模块进行数据交换。 3. IP 核配置:在 Vivado 中添加一个 IP 核,来实现 UART 控制器。可以选择现有的 UART IP 核,或者根据需要自定义一个。 4. 连接模块和 IP 核:使用 Vivado 的连接编辑器将自定义模块和 UART IP 核进行连接,以便数据传输和控制。 5. 约束文件设置:创建一个约束文件,对 I/O 端口进行约束和引脚映射。 6. 综合和实现:运行综合和实现过程,将设计映射到目标设备上。 7. 配置串口参数:在 SDK(Software Development Kit)中配置串口通信的参数,如波特率、数据位数、校验位等。 8. 软件开发:使用 C 或 C++ 编程语言编写软件来实现 UART 通信的逻辑。可以使用 SDK 提供的串口库函数来进行数据的发送和接收操作。 9. 编译和生成可执行文件:在 SDK 中编译软件代码,并生成可烧录到目标设备上的可执行文件。 10. 下载和调试:通过 JTAG 或者其他下载方式将可执行文件下载到目标设备上,并进行调试和验证。 通过以上步骤,就可以在 Vivado 中实现 UART 串口通信功能。使用自定义的模块和 UART IP 核,可以灵活地实现各种不同需求的串口通信功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值