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

通过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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版