通过can发多个数据帧,发送顺序有时候和预想的不一样。
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();
}
我是哪里搞错了呢?
hcan1.Init.TransmitFifoPriority = DISABLE;
你设置成这样再试一下看看 想了想,应该是已经把需要发送的帧放到发送邮箱里了,所以不会在while死等。
虽然放到发送邮箱了,但该邮箱发送竞争失败,等到总线空闲时才发送成功。
那么,如何使发送顺序按预想的来?如果只用一个发送邮箱应该可以吧?但是发送函数无法指定发送邮箱,指返回一个参数说明用到的是哪个发送邮箱。
或者,在两次发送之间加延时?本来要发几十帧,还要考虑上位机的等待超时。 试了加延时,可行。
用的Hal_Delay()函数,一开始加了5ms的延时,顺序不出错了。但是,因为有几十帧,累加延时太长了。
最小只能设1ms,也不出错,延迟也不那么明显了,但是仍然有点。 westzg 发表于 2019-3-26 13:40
hcan1.Init.TransmitFifoPriority = DISABLE;
你设置成这样再试一下看看
谢谢。
原来就是DISABLE。
那么我就改成ENABLE,然后将延时去掉。
结果,没问题,很快。
页:
[1]