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

CAN数据重发

[复制链接]
猪小屁 提问时间:2025-7-25 15:16 / 未解决

在处理CAN分包数据的时候因为我回复的数据可能比较长所以我做了分包处理,代码如下:

uint32_t ulBASE_Can_SendBySelf( const typecan_config_t pConfig, uint8_t ucCan_Id, uint8_t pucTx_Data, uint32_t ulLen) { uint32_t ulTrans_MailBox = CAN_TX_MAILBOX0; CAN_TxHeaderTypeDef pTxMsg = ( CAN_TxHeaderTypeDef )mymalloc(sizeof(CAN_TxHeaderTypeDef)); CAN_HandleTypeDef phcan = ( CAN_HandleTypeDef )(pConfig->pcan); typecanid_ext_u2 ExtID = { .ch.srcaddr = pConfig->ucmajor_id, .ch.dstaddr = ucCan_Id, }; uint32_t ulCount = (ulLen / MAX_CAN_GOT_LENTHS) + ( (0 != (ulLen % MAX_CAN_GOT_LENTHS))? 1 : 0 ); //防止len=0不会发送信息 if( 0 == ulCount) { ulCount++; }

uint8_t Tx_Data[ 8 * ulCount ]; pTxMsg->RTR = CAN_RTR_DATA;

for( uint8_t i = 0; i < ulCount; i++ ) { if( CAN_EXT_ID == pConfig->type) { pTxMsg->IDE = CAN_ID_EXT; pTxMsg->StdId = 0; pTxMsg->ExtId = ExtID.extid; Tx_Data[i 8] = ulCount; Tx_Data[i 8 + 1] = i+1;

    if( 0 == ulLen)
    {
        pTxMsg->DLC = 0;
    }
    else
    {
        pTxMsg->DLC = MAX_CAN_GOT_LENTHS + 2;
    }
    if( ((i+1) == ulCount) && (  ulLen % MAX_CAN_GOT_LENTHS ))  //最后一帧数据
    {
        pTxMsg->DLC = ulLen % MAX_CAN_GOT_LENTHS + 2;
    }
    memcpy(&Tx_Data[8 * i + 2],&pucTx_Data[6 * i],MAX_CAN_GOT_LENTHS);
}
else
{
    pTxMsg->IDE = CAN_ID_STD;
    pTxMsg->StdId = ( ucCan_Id << 5 ) + pConfig->ucmajor_id;
    pTxMsg->ExtId = 0;
    pTxMsg->DLC = ulLen;
}
uint32_t tickstart = HAL_GetTick();
while(( phcan->Instance->TSR & CAN_TSR_TME0) == 0U)
{
    if ((HAL_GetTick() - tickstart) > MAX_TX_TIMEOUT)
    {
            // 超时,返回错误
            return HAL_ERROR;
    }
}
HAL_CAN_AddTxMessage( phcan, pTxMsg, &Tx_Data[i * 8], &ulTrans_MailBox);
while(( phcan->Instance->TSR & CAN_TSR_RQCP0) == 0U)
{
    if ((HAL_GetTick() - tickstart) > MAX_TX_TIMEOUT)
    {
            // 超时,返回错误
            return HAL_ERROR;
    }
}

if( ( phcan->Instance->TSR & CAN_TSR_TXOK0) == 0U )
{
    myfree(pTxMsg);
    return MY_FALSE;
}

} myfree(pTxMsg);

return MY_TRUE; }

但是监控数据发现了一个邪门现象:

c50f1fc63ab50a924b9661d71554c5e4_compress.jpg

如图:数据发送了两遍,于是我进入调试模式单步查看。当我将断点打在HAL_CAN_AddTxMessage处时,每运行一次发出一帧的数据,但是在最后一帧的时候执行HAL_CAN_AddTxMessage会一下发送最后一帧加重复7帧.但是查看最后一次进入HAL_CAN_AddTxMessage的长度和数据都是对的,包括最后一次发送完邮箱里也是07070000.

88457af5790f6049910d79b1e87d36ef_compress.jpg617bab13a027adc77743bfb89cb371ab_compress.jpg为什么会出现这种情况有没有大佬解释一下

企业微信截图_17534111363061.png
企业微信截图_17534111363061.png
收藏 评论1 发布时间:2025-7-25 15:16

举报

1个回答
xmshao 回答时间:昨天 17:58

你将等待邮箱0收发状态 改成 等待是否有空邮箱后再做发送。

// 等待是否有空邮箱 while (HAL_CAN_GetTxMailboxesFreeLevel(phcan) == 0) { if ((HAL_GetTick() - tickstart) > MAX_TX_TIMEOUT) { return HAL_ERROR; } }

//有就来发送数据 if (HAL_CAN_AddTxMessage(。。。。。。

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版