STM32单片机使用CAN协议进行通信引用这个博客的一段话
txt
CAN的遥控帧(Remote Frame)的主要作用是请求其他节点发送具
有特定ID的数据帧。具体来说,当一个节点需要从另一个节点获取数
据时,它可以发送一个遥控帧,而不是直接发送数据。这个遥控帧包
含了请求数据的ID,但没有包含数据本身。接收到遥控帧的节点如果
拥有与遥控帧ID相匹配的数据帧,就会响应并发送相应的数据帧。这
种方式允许节点仅请求需要的数据,而不是不断发送可能不需要的数
据,从而提高了网络的效率和减少了不必要的数据传输。
我们使用,只需要在发送的时候将rtr设置为1即可。
eg:
c
u8 can1_send_msg(u32 id, u8 ide, u8 rtr, u8 *msg, u8 len)
can1_send_msg(0x12AB0001,1,0,canbuf,8);
//接收的时候也只需要加一个额外的判断即可
//注意判断条件 rtr==2才是遥控帧,看手册
u8 can1_receive_msg(u32 id, u8 *buf)
{
u32 rid = 0;
u8 ide, rtr, len = 0;
if (can1_pend_msg(0) == 0)return 0; /* 没有接收到数据,直接退出 */
can1_rx_msg(0, &rid, &ide, &rtr, &len, buf); /* 读取数据 */
if (ide != 4|| rtr != 2 ) /* 不是扩展帧 / 不是远程帧 */
{
len = 0; /* 接收错误 */
}
return len;
}
补充:
- 如果开启了接收中断,那在main函数中轮询接收就无效了
c
int main()
{
key=can1_receive_msg(0X12AB0001,canbuf);//开了中断这里就不好使了。
}
- 点对点通信 ≠ 远程帧:
- 点对点通信可通过普通数据帧直接完成,无需远程帧。
- 远程帧是一种请求机制,而非通信的必要条件。