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

通过can发多个数据帧,发送顺序有时候和预想的不一样。

[复制链接]
any012 提问时间:2019-3-25 15:21 /
5ST金币
stm32f103,1.7.0的HAL库。
和上位机用can通讯时,需要发送较多的数据。
本来想这样发的:
00 xx ...;
01 xx ...;
02 xx ...;
....;
0F xx ...;

结果上位机接收到的,有时候会是这样的:

01 xx ...;
02 xx ...;
....;
0F xx ...;
00 xx ...;

像是有时候会发送时没成功,然后过一段时间后重发了。
可我现在是在发送前,死等发送邮箱直到空。

  1. void CAN_SendDebug(uint32_t ext_id, uint8_t len, uint8_t * data)
  2. {
  3.     uint32_t tickstart = 0U;

  4.     TxHeader.ExtId = ext_id;
  5.     TxHeader.DLC = len;

  6.     tickstart = HAL_GetTick();
  7.     while(HAL_CAN_GetTxMailboxesFreeLevel(&hcan) == 0);
  8.     // {
  9.     //     if((HAL_GetTick() - tickstart) > CAN_SEND_TIMEOUT)
  10.     //         return;
  11.     // }
  12.     if (HAL_CAN_AddTxMessage(&hcan, &TxHeader, data, &TxMailbox) != HAL_OK)
  13.         Error_Handler();
  14. }
复制代码

我是哪里搞错了呢?

最佳答案

查看完整内容

hcan1.Init.TransmitFifoPriority = DISABLE; 你设置成这样再试一下看看
收藏 评论4 发布时间:2019-3-25 15:21

举报

4个回答
westzg 回答时间:2019-3-25 15:21:02
  hcan1.Init.TransmitFifoPriority = DISABLE;
你设置成这样再试一下看看

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

any012 回答时间:2019-3-26 08:41:28
想了想,应该是已经把需要发送的帧放到发送邮箱里了,所以不会在while死等。
虽然放到发送邮箱了,但该邮箱发送竞争失败,等到总线空闲时才发送成功。

那么,如何使发送顺序按预想的来?如果只用一个发送邮箱应该可以吧?但是发送函数无法指定发送邮箱,指返回一个参数说明用到的是哪个发送邮箱。
或者,在两次发送之间加延时?本来要发几十帧,还要考虑上位机的等待超时。
any012 回答时间:2019-3-26 08:47:46
试了加延时,可行。
用的Hal_Delay()函数,一开始加了5ms的延时,顺序不出错了。但是,因为有几十帧,累加延时太长了。
最小只能设1ms,也不出错,延迟也不那么明显了,但是仍然有点。
any012 回答时间:2019-3-26 13:53:06
westzg 发表于 2019-3-26 13:40
hcan1.Init.TransmitFifoPriority = DISABLE;
你设置成这样再试一下看看

谢谢。
原来就是DISABLE。
那么我就改成ENABLE,然后将延时去掉。
结果,没问题,很快。

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版