你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32f103 CAN通讯多帧发送问题?

[复制链接]
qazplm3218 提问时间:2019-9-6 09:26 /
发送数据共有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[0]=0x01;
  TxMessage.Data[1]=0x1D;
  TxMessage.Data[2]=xxxx[0];
  TxMessage.Data[3]=xxxx[1];
  TxMessage.Data[4]=xxxx[2];
  TxMessage.Data[5]=xxxx[3];
  TxMessage.Data[6]=xxxx[4];
  TxMessage.Data[7]=xxxx[5];
  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帧吗??

测试截图:

测试截图

测试截图




收藏 评论6 发布时间:2019-9-6 09:26

举报

6个回答
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
楼主没有等待发送完毕就进行发送,建议增加对发送缓冲区的判断,这个在例程中都包含了。
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版