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

1.7.0版HAL库的can连续发送时邮箱会满。如何解决。CAN_AddTxMes...

[复制链接]
any012 提问时间:2019-2-28 10:02 /
6ST金币
把cubemx升级到5.1.0了,顺便把f1的hal库版本升级到1.7.0了。看介绍说can部分做了修改。
结果遇到了问题,本想在for循环里发送5帧,结果发送3帧后就不发送了。
调用的是CAN_AddTxMessage()函数,请教该如何操作确保顺利发送?尝试加了个延时倒是能解决,但不想空等啊。

最佳答案

查看完整内容

发之前先查询一下 邮箱是否满了,满了就等一下再发 while( HAL_CAN_GetTxMailboxesFreeLevel( &hcan1 ) == 0 ); HAL_CAN_AddTxMessage(&hcan1, &TxHeader, pTxMsg->Data, &TxMailbox);
收藏 2 评论13 发布时间:2019-2-28 10:02

举报

13个回答
westzg 回答时间:2019-2-28 10:02:35
发之前先查询一下 邮箱是否满了,满了就等一下再发
while( HAL_CAN_GetTxMailboxesFreeLevel( &hcan1 ) == 0 );

HAL_CAN_AddTxMessage(&hcan1, &TxHeader, pTxMsg->Data, &TxMailbox);

评分

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

查看全部评分

any012 回答时间:2019-2-28 10:26:46
谢谢,可以了。
顺便请教下,CAN_AddTxMessage()这个函数的最后一个参数,在什么情况下才会用到?
westzg 回答时间:2019-2-28 10:37:30
本帖最后由 westzg 于 2019-2-28 10:40 编辑

有三个发送邮箱,&TxMailbox 标记了成功写入到那个发送邮箱   

评分

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

查看全部评分

奏奏奏 回答时间:2019-2-28 16:02:54
我才发现我项目用的发送函数HAL_CAN_Transmit()
在新库函数中已经变成CAN_AddTxMessage()
废鱼 回答时间:2019-2-28 16:23:33
可以考虑用中断方式发送。

评分

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

查看全部评分

奏奏奏 回答时间:2019-2-28 21:06:29
安 发表于 2019-2-28 16:23
可以考虑用中断方式发送。

新函数库的说明是:
      *** Interrupt mode operation ***
      ================================
    [..]
      (#) Notifications are activated using HAL_CAN_ActivateNotification()
          function. Then, the process can be controlled through the
          available user callbacks: HAL_CAN_xxxCallback(), using same APIs
          HAL_CAN_GetRxMessage() and HAL_CAN_AddTxMessage().

      (#) Notifications can be deactivated using
          HAL_CAN_DeactivateNotification() function.

      (#) Special care should be taken for CAN_IT_RX_FIFO0_MSG_PENDING and
          CAN_IT_RX_FIFO1_MSG_PENDING notifications. These notifications trig
          the callbacks HAL_CAN_RxFIFO0MsgPendingCallback() and
          HAL_CAN_RxFIFO1MsgPendingCallback(). User has two possible options
          here.
            (++) Directly get the Rx message in the callback, using
                 HAL_CAN_GetRxMessage().
            (++) Or deactivate the notification in the callback without
                 getting the Rx message. The Rx message can then be got later
                 using HAL_CAN_GetRxMessage(). Once the Rx message have been
                 read, the notification can be activated again.


函数名称不像以前那样HAL_CAN_Transmit()变成HAL_CAN_Transmit_IT()

评分

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

查看全部评分

废鱼 回答时间:2019-3-1 08:44:06
奏奏奏 发表于 2019-2-28 21:06
新函数库的说明是:
      *** Interrupt mode operation ***
      ================================

再变化,本质还是不会改变的。只不过我们的使用方式会修改一下。
thisc9f7c8 回答时间:2019-3-13 09:30:25
请问这个解决办法while循环判断,跟普通的if模式有什么区别,下面这种就没法正常的发消息
  1. if(HAL_CAN_GetTxMailboxesFreeLevel(hcan))
  2. {
  3.         header.StdId=ID;
  4.         header.IDE = CAN_ID_STD;
  5.         header.RTR = CAN_RTR_DATA;
  6.         header.DLC=8;
  7.                         //header.TransmitGlobalTime = DISABLE;       
复制代码
thisc9f7c8 回答时间:2019-3-13 09:31:38
少了一行  HAL_CAN_AddTxMessage(hcan,&header,pData,(uint32_t*)CAN_TX_MAILBOX0);
any012 回答时间:2019-3-13 13:44:16
if的话只会判断一次,发送邮箱已满的话,就不发送了。
而用while的话,会死等,灯到发送邮箱有空的。
huangyanga 回答时间:2019-3-29 19:27:16
学习了~~
shuaishuai6666 回答时间:2019-6-28 17:22:22
您好 想问一下 如何实现for循环一直发送数据 txmessage和rxmessage函数里定义的是8个数的数组 所以目前只成功发送并接收8个数
yangquandan 回答时间:2020-7-15 20:19:08
any012 发表于 2019-2-28 10:26
谢谢,可以了。
顺便请教下,CAN_AddTxMessage()这个函数的最后一个参数,在什么情况下才会用到? ...

楼主 请问你是怎么解决的,我是单独用CAN1没问题,但是加上CAN2 就全都不行了,死在了CAN2 的 HAL_CAN_GetTxMailboxesFreeLevel

所属标签

相似问题

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