stm32f103,1.7.0的HAL库。
和上位机用can通讯时,需要发送较多的数据。
本来想这样发的:
00 xx ...;
01 xx ...;
02 xx ...;
....;
0F xx ...;
结果上位机接收到的,有时候会是这样的:
01 xx ...; 02 xx ...; ....; 0F xx ...; 00 xx ...;
像是有时候会发送时没成功,然后过一段时间后重发了。
可我现在是在发送前,死等发送邮箱直到空。
- void CAN_SendDebug(uint32_t ext_id, uint8_t len, uint8_t * data)
- {
- uint32_t tickstart = 0U;
- TxHeader.ExtId = ext_id;
- TxHeader.DLC = len;
- tickstart = HAL_GetTick();
- while(HAL_CAN_GetTxMailboxesFreeLevel(&hcan) == 0);
- // {
- // if((HAL_GetTick() - tickstart) > CAN_SEND_TIMEOUT)
- // return;
- // }
- if (HAL_CAN_AddTxMessage(&hcan, &TxHeader, data, &TxMailbox) != HAL_OK)
- Error_Handler();
- }
复制代码
我是哪里搞错了呢?
|
你设置成这样再试一下看看
评分
查看全部评分
虽然放到发送邮箱了,但该邮箱发送竞争失败,等到总线空闲时才发送成功。
那么,如何使发送顺序按预想的来?如果只用一个发送邮箱应该可以吧?但是发送函数无法指定发送邮箱,指返回一个参数说明用到的是哪个发送邮箱。
或者,在两次发送之间加延时?本来要发几十帧,还要考虑上位机的等待超时。
用的Hal_Delay()函数,一开始加了5ms的延时,顺序不出错了。但是,因为有几十帧,累加延时太长了。
最小只能设1ms,也不出错,延迟也不那么明显了,但是仍然有点。
谢谢。
原来就是DISABLE。
那么我就改成ENABLE,然后将延时去掉。
结果,没问题,很快。