CAN节点通过标识符来识别CAN帧是不是自己想要的,识别方法就是通过滤波屏蔽寄存器的设置来完成,接收滤波寄存器设置了标识符每位的值,接收屏蔽寄存器一般有相同的数量匹配接收滤波寄存器,规定接收滤波寄存器标识符每一位的值是否需要进行匹配,比如芯片设置有6个接收滤波寄存器和6个接收屏蔽寄存器,从总线上接收CAN帧,然后依次将收到的CAN帧标识符与6对接收滤波和屏蔽寄存器进行匹配,符合某对接收滤波和屏蔽寄存器要求了,就停止匹配,将数据接收到对应的缓冲区中.例如设置某接收滤波寄存器00000000001(11位),接收屏蔽寄存器11111111101(11位),则该对组合会拒绝接收00000000011和00000000001之外所有的标识符对应的CAN帧,因为屏蔽器规定第二位(为0)以外的所有标识符位要严格匹配(与滤波器值一致),第二位的滤波器值和收到的CAN标识符第二位值是否一致都可以.不同的芯片滤波屏蔽寄存器的运行方式不太一致,至少我用过的AT90CAN128和MCP2515差别就很大,不过原理都一样.4楼:初学CAN的朋友应该都会遇到我这样的问题,我的理解是,一个节点向网络中发送一条信息,所有的节点都能收到,收到后每个节点将收到的标识符自行与自己的比较,符合的才接收,过滤器和屏蔽器决定标识符中哪些位参与比较,也就是说有些位可以不参与比较就直接接收,这很有用,比如,11位的标识符不可能都用来标识下位机号,你一个网络不可能连接那么多节点,11位的标识符有点浪费,我们可以将最高3位用来表示所发送的数据类型,在接收点设置滤波器和屏蔽器只比较节点号部分,先将数据接收下来,在将最高3位拿来判断是什么数据,我的试验结果是RXB0SIDH会被发送端的TXB0SIDH修改,判断RXB0SIDH的最高三位即可知道接收的数据类型,以上是我这几天的学习结果,希望大家共同讨论。CAN_FilterInitStructure.CAN_FilterNumber=0;CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;CAN_FilterInitStructure.CAN_FilterIdHigh=(((u32)CAN_ID021)&0xFFFF0000)16;CAN_FilterInitStructure.CAN_FilterIdLow=(((u32)CAN_ID021)|CAN_ID_STD|CAN_RTR_DATA)&0xFFFF;CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xFFFF;CAN_FilterInitStructure.CAN_FilterMaskIdLow=0xFFFF;CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;CAN_FilterInit(&CAN_FilterInitStructure);楼主没有理解CAN里面节点ID的含义。1.A发出的远程帧中ID为B的ID2.B收到一个ID跟自己节点相符的远程帧后,就发同样ID的数据帧就可以了。3.由于数据都是在CAN上广播的,所以A就可以收到这个数据帧了。形象一点就像在广播里面点歌:A想听张国荣的歌,就给电台B打个电话(远程帧)电话号码当然是电台的号码,电台不需要知道谁点的歌,只管放就行了。远程帧的作用,如能详细描述那更好!4楼:可以用来表征这个节点的存在(告诉其它节点还在线,而又无其它数据传递必要)。CANopen规范中,通常不建议使用。5楼:是告诉其他的CPU我需要这个ID号的数据,远程帧没有数据,只有ID和远程帧位说点大白话6楼:首先远程帧虽然是用来发送的,但是却是用接收邮箱来配置(这句话说的肯定对)。明白了吧。就是接收邮箱想接收某ID数据,就发送个远程帧做触发(这句话说的不一定对)8楼:是的,当你需要接受某个远程节点的数据时,就发送一个远程帧过去,那节点就会做出响应,发回数据,这个过程一般是在软件上处理,也有硬件实现的。