qazplm3218 发表于 2019-9-6 09:26:30

stm32f103 CAN通讯多帧发送问题?

发送数据共有29个字节,所以拆开5帧发送
多帧发送数据格式:
                                byte0            byte1      byte2   ....       byte7      
                                单帧数据   数据长度      数据开始   
                第一帧        0x01             0-255
                                                                               
                                byte0            byte1      byte2   ....       byte7      
                                单帧数据      
                第二帧       0x02               

                                byte0            byte1      byte2   ....       byte7      
                                单帧数据      
                第xx帧       xx                                                         数据结束                           


void can_tx1(void)
{
CanTxMsg TxMessage;

TxMessage.StdId=0x0001;                                //标准标识符为0x00
//TxMessage.ExtId=0x1314;                                 //扩展标识符0x0000
TxMessage.IDE=CAN_ID_STD;                        //使用标准标识符
TxMessage.RTR=CAN_RTR_DATA;                        //为数据帧
TxMessage.DLC=8;                                        //消息的数据长度为8个字节
TxMessage.Data=0x01;
TxMessage.Data=0x1D;
TxMessage.Data=xxxx;
TxMessage.Data=xxxx;
TxMessage.Data=xxxx;
TxMessage.Data=xxxx;
TxMessage.Data=xxxx;
TxMessage.Data=xxxx;
CAN_Transmit(CAN1,&TxMessage);                                                                         //发送数据
}


void can_send_data(void)
{
        if(rec_ok_flag)
        {
                rec_ok_flag=0;
                can_tx1();
                can_tx2();
                can_tx3();
                can_tx4();
                can_tx5();
        }
}


数据拆开5帧发送,但是只发送了前面3帧,后面2帧没有发送,不知道为什么?是最多只发送3帧吗??

测试截图:




sdjidf 发表于 2020-9-4 16:32:07

安 发表于 2019-9-8 20:36
楼主没有等待发送完毕就进行发送,建议增加对发送缓冲区的判断,这个在例程中都包含了。 ...

您好,请问可不可以分享下例程

哀歌与世无争 发表于 2019-9-6 09:48:01

发送太快了,没判断是否发送完成就接着发下一帧,前三帧能发出去因为stm32 can发送邮箱有三个,所以其实是先存到邮箱了才会顺利发出,后面两帧因为邮箱满了而第一帧都还没发完,所以没发出去就丢了。
可以试试中间加个延时看看
can_tx1();
delay_ms(10)
can_tx2();
delay_ms(10)
。。。
也可以在发完后判断是否完成或超时
      while((CAN_TransmitStatus(CAN1, mbox)==CAN_TxStatus_Failed)&&(i<0XFFF))i++;      //等待发送结束
      if(i>=0XFFF)return 1;

或者下次发送前判断上次是否发送完成,邮箱是否满了

qazplm3218 发表于 2019-9-6 10:01:27

哀歌与世无争 发表于 2019-9-6 09:48
发送太快了,没判断是否发送完成就接着发下一帧,前三帧能发出去因为stm32 can发送邮箱有三个,所以其实是 ...

谢谢你,我在测试下

攻城狮222 发表于 2019-9-8 14:39:16

请问楼主问题解决路吗

qazplm3218 发表于 2019-9-8 20:06:34

攻城狮222 发表于 2019-9-8 14:39
请问楼主问题解决路吗

你好,问题已经解决,发送时间太快了,在帧与帧之间在增加延时解决问题!

发表于 2019-9-8 20:36:30

楼主没有等待发送完毕就进行发送,建议增加对发送缓冲区的判断,这个在例程中都包含了。
页: [1]
查看完整版本: stm32f103 CAN通讯多帧发送问题?