any012 发表于 2019-3-25 15:21:01

通过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();
}
我是哪里搞错了呢?

westzg 发表于 2019-3-25 15:21:02

hcan1.Init.TransmitFifoPriority = DISABLE;
你设置成这样再试一下看看

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,然后将延时去掉。
结果,没问题,很快。
页: [1]
查看完整版本: 通过can发多个数据帧,发送顺序有时候和预想的不一样。