OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 10291|回复: 19

CAN接收多个报文问题

[复制链接]

11

主题

99

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5448
金钱
5448
注册时间
2015-11-5
在线时间
701 小时
发表于 2016-5-24 11:20:39 | 显示全部楼层 |阅读模式
20金钱
我的探索板要接收很多组不同ID的CAN报文,这些ID不同的报文意义各不一样,我该如何接收?是设置全部不过滤都接收还是设置很多个过滤器?还有个最重要的问题就是,接收过来后我要怎么知道它是哪个ID的报文?希望能有大神帮忙解答一下,比较急,感激不尽!

最佳答案

查看完整内容[请看2#楼]

CAN_FilterInitStructure.CAN_FilterNumber=0; CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; // 标识符屏蔽位模式 CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; // 32位过滤器 CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000; // 过滤器标识符 CAN_FilterInitStructure.CAN_FilterIdLow =0x0000; CAN_FilterInitStructure.CAN_FilterIdLow ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
156
金钱
156
注册时间
2013-1-20
在线时间
50 小时
发表于 2016-5-24 11:20:40 | 显示全部楼层
CAN_FilterInitStructure.CAN_FilterNumber=0;
    CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;           // 标识符屏蔽位模式
    CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;   // 32位过滤器
    CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;                                   // 过滤器标识符
    CAN_FilterInitStructure.CAN_FilterIdLow =0x0000;
    CAN_FilterInitStructure.CAN_FilterIdLow |=Sys1.UnitAddr<<11;         //单元地址
    CAN_FilterInitStructure.CAN_FilterIdLow |=Sys1.DevideAddr<<3;        //单元分地址
    CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xefff;                         // 过滤器屏蔽标识符 最高位不过滤
    CAN_FilterInitStructure.CAN_FilterMaskIdLow=0xfff8;
    CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;             // FIFO0指向过滤器
    CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
    CAN_FilterInit(&CAN_FilterInitStructure);



    CAN_FilterInitStructure.CAN_FilterNumber=1;
    CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;           // 标识符屏蔽位模式
    CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;   // 32位过滤器
    CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;                                   // 过滤器标识符
    CAN_FilterInitStructure.CAN_FilterIdLow =0x0000;
    CAN_FilterInitStructure.CAN_FilterIdLow |=Sys1.UnitAddr<<11;         //单元地址
    CAN_FilterInitStructure.CAN_FilterIdLow |=Sys1.DevideAddr<<3;        //单元分地址
    CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xefff;                         // 过滤器屏蔽标识符 最高位不过滤
    CAN_FilterInitStructure.CAN_FilterMaskIdLow=0xf800;                  // 分地址不过滤,用于接收单元类的命令
    CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;             // FIFO0指向过滤器
    CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
    CAN_FilterInit(&CAN_FilterInitStructure);

上面是我的CAN过滤器设置,双滤波
关于接收过来的数据是哪个ID的报文,这个更简单了,st官方自带的void CAN_Receive(CAN_TypeDef* CANx, uint8_t FIFONumber, CanRxMsg* RxMessage)函数里面,RxMessage->StdId或RxMessage->ExtId 就是你说的ID,注意区分标准帧还是扩展帧
回复

使用道具 举报

13

主题

296

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2066
金钱
2066
注册时间
2012-5-26
在线时间
291 小时
发表于 2016-5-24 11:39:22 | 显示全部楼层
接收到得信息里包含ID
活着才是王道!健康是一切的前提!
回复

使用道具 举报

11

主题

99

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5448
金钱
5448
注册时间
2015-11-5
在线时间
701 小时
 楼主| 发表于 2016-5-24 11:59:20 | 显示全部楼层
gesang 发表于 2016-5-24 11:40
CAN_FilterInitStructure.CAN_FilterNumber=0;
    CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterM ...

原来如此,没进这个库函数看过……剩下的我先自己研究研究,就先不问啦。等遇到问题还请大神们帮帮忙。谢谢了!
回复

使用道具 举报

0

主题

7

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2016-5-28
在线时间
3 小时
发表于 2016-5-28 14:16:11 | 显示全部楼层
逍遥叹乄 发表于 2016-5-24 11:59
原来如此,没进这个库函数看过……剩下的我先自己研究研究,就先不问啦。等遇到问题还请大神们帮帮忙。谢 ...

哥们,你搞明白了吗  ,能给我说说吗  就是判断是哪个数据咋么判断
回复

使用道具 举报

11

主题

99

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5448
金钱
5448
注册时间
2015-11-5
在线时间
701 小时
 楼主| 发表于 2016-5-28 21:49:04 | 显示全部楼层
逍遥叹乄 发表于 2016-5-24 11:59
原来如此,没进这个库函数看过……剩下的我先自己研究研究,就先不问啦。等遇到问题还请大神们帮帮忙。谢 ...

楼上不是说了吗?st官方自带的void CAN_Receive(CAN_TypeDef* CANx, uint8_t FIFONumber, CanRxMsg* RxMessage)函数里面,RxMessage->StdId或RxMessage->ExtId 就是你说的ID,注意区分标准帧还是扩展帧
回复

使用道具 举报

0

主题

7

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2016-5-28
在线时间
3 小时
发表于 2016-5-29 22:05:45 | 显示全部楼层
是一个什么思路呢 ?  这个我看了   但是具体是怎么实现的   我想不明白   这个函数是要把我自己接受的的3个ID写进去吗?谢谢
回复

使用道具 举报

11

主题

99

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5448
金钱
5448
注册时间
2015-11-5
在线时间
701 小时
 楼主| 发表于 2016-5-30 15:33:20 | 显示全部楼层
STM牛 发表于 2016-5-29 22:05
是一个什么思路呢 ?  这个我看了   但是具体是怎么实现的   我想不明白   这个函数是要把我自己接受的的3 ...

第一个参数是哪个CAN,第二个参数是接收用的是哪个FIFO,第三个参数就是接收结构体指针,你收到的报文信息都在这里面,包括ID什么的
回复

使用道具 举报

0

主题

7

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2016-5-28
在线时间
3 小时
发表于 2016-6-1 11:11:04 | 显示全部楼层
逍遥叹乄 发表于 2016-5-30 15:33
第一个参数是哪个CAN,第二个参数是接收用的是哪个FIFO,第三个参数就是接收结构体指针,你收到的报文信息 ...

嗯 我看到这个了  分辨FMI就可以了   谢谢
回复

使用道具 举报

0

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2017-5-25
在线时间
26 小时
发表于 2017-5-25 15:34:31 | 显示全部楼层
那请问u8 CAN1_Mode_Init(u8 tsjw,u8 tbs2,u8 tbs1,u16 brp,u8 mode)里CAN_FilterIdHigh和地位的ID怎么设置,接收的有多个邮箱的ID,这个函数中要填哪一个呢?
回复

使用道具 举报

11

主题

99

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5448
金钱
5448
注册时间
2015-11-5
在线时间
701 小时
 楼主| 发表于 2017-5-25 17:42:28 | 显示全部楼层
zl9582 发表于 2017-5-25 15:34
那请问u8 CAN1_Mode_Init(u8 tsjw,u8 tbs2,u8 tbs1,u16 brp,u8 mode)里CAN_FilterIdHigh和地位的ID怎么设置 ...

你可以参考一下我的CAN过滤器配置
QQ截图20170525174059.jpg
回复

使用道具 举报

0

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2017-5-25
在线时间
26 小时
发表于 2017-5-25 17:49:16 | 显示全部楼层
逍遥叹乄 发表于 2017-5-25 17:42
你可以参考一下我的CAN过滤器配置

那如果是接收3个邮箱的数据怎么配置,这个初始化函数里只有一个邮箱ID的高低位,其他两个邮箱的ID怎么设置?
回复

使用道具 举报

11

主题

99

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5448
金钱
5448
注册时间
2015-11-5
在线时间
701 小时
 楼主| 发表于 2017-5-25 20:06:58 | 显示全部楼层
zl9582 发表于 2017-5-25 17:49
那如果是接收3个邮箱的数据怎么配置,这个初始化函数里只有一个邮箱ID的高低位,其他两个邮箱的ID怎么设 ...

你是指有3种ID的报文吗?我这个也是接收好几种ID的,把过滤器配置成标识符掩码模式,比较这几个ID的每个位的异同,无需关心位的掩码对应为0,必须匹配的位的掩码对应为1。你可以看我的接收ID:0x04F101EF,它只是000X XX00 1111 0001 0000 0XXX 1110 1111里面的一种情况,当然你可以把接收ID配置成别的,只要符合上面那个标准。
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2017-9-3
在线时间
5 小时
发表于 2018-1-3 14:24:53 | 显示全部楼层
这个掩码 看的不是很懂
回复

使用道具 举报

0

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2019-9-3
在线时间
18 小时
发表于 2020-6-5 14:18:15 | 显示全部楼层
逍遥叹乄 发表于 2017-5-25 20:06
你是指有3种ID的报文吗?我这个也是接收好几种ID的,把过滤器配置成标识符掩码模式,比较这几个ID的每个 ...

能分享一下您的接受多种ID的那个程序吗,想学习一下。1047673928@qq.com
回复

使用道具 举报

6

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2021-9-6
在线时间
9 小时
发表于 2021-9-27 20:37:23 | 显示全部楼层
超锦年 发表于 2020-6-5 14:18
能分享一下您的接受多种ID的那个程序吗,想学习一下。


老铁,请问接收多个ID的程序搞定了吗?能分享学习一下吗,最近快被搞疯了。。。。。。。。。1669663357@qq.com
回复

使用道具 举报

6

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2021-9-6
在线时间
9 小时
发表于 2022-3-24 11:04:03 | 显示全部楼层
博主,想请教一下,我发送的ID都是一样的,只是每次发送的数据不一样,我发送六条数据,却只能接收到三条消息,我该怎么处理才能把六条消息都接收到?
回复

使用道具 举报

6

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2021-9-6
在线时间
9 小时
发表于 2022-3-24 11:08:45 | 显示全部楼层
15628961848 发表于 2022-3-24 11:04
博主,想请教一下,我发送的ID都是一样的,只是每次发送的数据不一样,我发送六条数据,却只能接收到三条消 ...

我自己的初步判断是,发送邮箱和接收邮箱都是是三个,一次发送6个,接收不过来,用程序解决这个问题的话,我大概应该怎么写才行?
回复

使用道具 举报

1

主题

9

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2022-3-1
在线时间
12 小时
发表于 2022-3-26 10:45:27 | 显示全部楼层
学习一下
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2022-3-26
在线时间
0 小时
发表于 2022-3-26 15:50:52 | 显示全部楼层
15628961848 发表于 2022-3-24 11:08
我自己的初步判断是,发送邮箱和接收邮箱都是是三个,一次发送6个,接收不过来,用程序解决这个问题的话 ...

铁子解决了吗,我现在也是这个问题,发送四个,接收也只能接收三个,第四个显示不出来
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 21:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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