STM32,can高速多帧数据连发

本文介绍了在STM32中使用CAN通信时遇到的问题,即发送超过3个字节的数据需要延时,否则可能导致数据丢失。作者通过限制使用邮箱0发送,避免了数据顺序错乱,并提供了发送和接收端的代码示例,以确保多帧数据的正确接收。此外,还分享了在项目中遇到的多节点数据错乱问题及应对策略,强调了软件层面的数据完整性校验重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2022年5月16日17:24:40更新,多节点,数据传输出现数据错乱的一点补充,具体内容补充到最下面.

问题:STM32的can数据发送,使用后发现每次如果发送超过3个字节就得延时,不然数据会丢失.网上查了些资料发现是can只有3个邮箱,所以如果邮箱满了就发送不了了.而且不延时发送的话数据顺序还会打乱.下面直接上代码.

can的库函数发送等待函数

u8 CanTx(u8 *buff,u8 len)
{
   
	u8 mbox;
	u16 i=0;
	CanTxMsg TxMessage;  
	if(len <= 8)
	{
   
		TxMessage.StdId = TX_FILTER_ID;						//标准标识符
		TxMessage.ExtId = TX_FILTER_ID; 					//扩展标识符0x0000
		TxMessage.IDE = CAN_ID_EXT;							//使用扩展帧
		TxMessage.RTR = CAN_RTR_DATA;						//为数据帧
		TxMessage.DLC = len;								//消息的数据长度为2个字节
		
		CAN1->TSR  &=~ CAN_IT_RQCP0; //清除邮箱0的的完成位,该位被清’0’时,邮箱0的其它发送状态位(TXOK0, ALST0和TERR0)也被清’0’。
		
		memcpy(TxMessage.Data,buff,len);
		mbox= CAN_Transmit(CAN1,&TxMessage); 		//发送数据
		
		while(1)
		{
   
			i++;
			//检测TXOK0位是否置1,发送成功会被置1.参考手册的TSR寄存器,第一位代表的是邮箱1发送完成位.如果需要3个邮箱同时开启,可以同时检				测mbox返回的对应的邮箱.
			if((CAN1->TSR)&0x02)
			{
   
				return 1;
			}
			if(i>=0XFFFF)
			{
   
				Can_Config();//总线异常,重新初始化
				CAN_Transmit(CAN1,&TxMessage); 		//再次发送数据
				return 
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值