首先,CAN总线不分主机,最多是整车厂在网络规划的时候定义了一个功能比较多的节点,各家车厂不一样(如网关),或者类似PowerMaster。但是CAN本身协议里是不存在主、从的。
其次,楼上说的仲裁延时的问题,CAN协议本身是考虑到这个问题的,当然按他的方法通过协议延时可以解决,但是既然CAN协议已经给了我们解决方法那肯定是更科学更有效的,具体的去看CAN的仲裁吧,你需要一个节点的报文发送不存在延时,只需要给它分配一个优先级很高的ID即可,当然这得从网络规划的角度出发,不是这么简单说说的。
回到你的问题,你说的主机请求数据,在CAN中只能是远程帧(一个远程标志位为1,数据场为空的帧),当这个帧出现在总线上时,拥有这个ID数据的节点就要发送这个同ID的完整帧(远程帧标志位为0)。但是只能有一个节点接受这个远程帧的请求。
这里强调一个概念,同一个ID的帧只能由一个节点发送,不然可想而知总线上都是冲突。
你补充问一下,你想实现什么效果吧
读CAN控制器的接收缓冲区的数据即可。注意,要是你下面的节点很多,建议对每一个节点回复数据的时间做一个简单的协议延时(如根据每个从节点的ID来延时),不然总线仲裁的时间会很长,影响通信效率;另外是你的主机处理接收缓冲区的速度要足够快,不然可能会丢数据(总线溢出)。