找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1997|回复: 5
收起左侧

有关CAN 通讯扩展帧和多ID问题求助

[复制链接]
ID:826942 发表于 2022-4-23 10:20 | 显示全部楼层 |阅读模式
在学习CAN的时候发现这个例程是用标准帧、回环模式,但是我需要改成扩展帧和多ID,看到手册上说改IDE这个配置可以改成扩展帧,就是这个代码   CAN_TxMessages[0].IDE     = CAN_ID_STD;    //设置为标准帧ID 此处可以改成扩展帧ID
但是除此之外还要怎么改?

  uint8_t i = 0;
    /* Init Transmit frame初始化发送帧*/
    CAN_TxMessages[0].StdId   = CAN_TX1_SID;   //标准识别符
    CAN_TxMessages[0].IDE     = CAN_ID_STD;    //设置为标准帧ID 此处可以改成扩展帧ID
    CAN_TxMessages[0].RTR     = CAN_RTRQ_DATA; //  数据帧
    CAN_TxMessages[0].DLC     = CAN_TXDLC_8;   // 数据为8
    for(i=0;i<CAN_TXDLC_8;i++)
    {
       CAN_TxMessages[0].Data[i]=CAN_Tx_Frame1_Data[i];
    }
    CAN_TxMessages[1].ExtId   = CAN_TX2_EID;//扩展帧标识符
    CAN_TxMessages[1].IDE     = CAN_ID_EXT;//设置成扩展帧
    CAN_TxMessages[1].RTR     = CAN_RTRQ_DATA;
    CAN_TxMessages[1].DLC     = CAN_TXDLC_8;
    for(i=0;i<CAN_TXDLC_8;i++)
    {
       CAN_TxMessages[1].Data[i]=CAN_Tx_Frame2_Data[i];
    }


这代码是不是说CAN_TxMessages[0].为标准帧 而 CAN_TxMessages[1].为扩展帧?

然后要是改扩展帧的话过滤器试试不是也要改?
uint8_t Check_CANRxMessage(CanRxMessage* RxMessage)  //检查CAN接收消息
{
        //   如果       接收消息是标准帧       与       接收消息不是发送CAN_TX1标准帧ID   或
        //              接收消息是扩展帧       与       接收消息不是发送CAN_TX2扩展帧ID
    if ( ((RxMessage->IDE == CAN_ID_STD) && (RxMessage->StdId != CAN_TX1_SID)) ||
         ((RxMessage->IDE == CAN_ID_EXT) && (RxMessage->ExtId != CAN_TX2_EID)) \
       ) return FAILED; //返回0
                //  接收消息数据帧不是发送的数据             返回0
    if ( RxMessage->RTR != CAN_RTRQ_DATA) return FAILED;
                //  接收消息数据长度不是发送的数据长度        返回0
    if ( RxMessage->DLC != CAN_TXDLC_8)   return FAILED;
    //  接收消息数据0位不是0x01         与  接收消息数据0位不是0x08       或
    if ( ( (RxMessage->Data[0] != 0x01) && (RxMessage->Data[0] != 0x08) ) ||\
         ( (RxMessage->Data[1] != 0x02) && (RxMessage->Data[1] != 0x07) ) ||\
         ( (RxMessage->Data[2] != 0x03) && (RxMessage->Data[2] != 0x06) ) ||\
         ( (RxMessage->Data[3] != 0x04) && (RxMessage->Data[3] != 0x05) ) ||\
         ( (RxMessage->Data[4] != 0x05) && (RxMessage->Data[4] != 0x04) ) ||\
         ( (RxMessage->Data[5] != 0x06) && (RxMessage->Data[5] != 0x03) ) ||\
         ( (RxMessage->Data[6] != 0x07) && (RxMessage->Data[6] != 0x02) ) ||\
         ( (RxMessage->Data[7] != 0x08) && (RxMessage->Data[7] != 0x01) ) \
        )  return FAILED;//返回0
    return PASSED;//返回1
}

就是这个函数吗?
恳请大佬指点下 在这个例程上要改成扩展帧的话要改那几个代码?


回复

使用道具 举报

ID:826942 发表于 2022-4-23 10:21 | 显示全部楼层
多ID的话该怎么配置?
回复

使用道具 举报

ID:573999 发表于 2022-4-24 07:08 | 显示全部楼层
你说的是CAN接收过滤吧,库函数说明就有
回复

使用道具 举报

ID:573999 发表于 2022-4-24 07:10 | 显示全部楼层
同样接收也可以用用户数据处理来做逻辑实现的,只不过处理的数据多点
回复

使用道具 举报

ID:1013883 发表于 2022-4-24 09:20 | 显示全部楼层
发送和接收都得是一样的,发送寄存器是标准帧,接收寄存器也得是标准帧,反之同理
回复

使用道具 举报

ID:826942 发表于 2022-4-24 10:50 | 显示全部楼层
SDDQ 发表于 2022-4-24 09:20
发送和接收都得是一样的,发送寄存器是标准帧,接收寄存器也得是标准帧,反之同理

我也是这样改的 但是测试的话说失败啦
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表