stm32 can 遥控帧的问题

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;
}

补充:

  1. 如果开启了接收中断,那在main函数中轮询接收就无效了
c 复制代码
int main()
{
key=can1_receive_msg(0X12AB0001,canbuf);//开了中断这里就不好使了。
}
  1. 点对点通信 ≠ 远程帧:
  • 点对点通信可通过普通数据帧直接完成,无需远程帧。
  • 远程帧是一种请求机制,而非通信的必要条件。
相关推荐
FakeOccupational1 小时前
【电路笔记 STM32】Cortex-M7 内核上的数据缓存结构图 + MPU内存保护单元 + Cache基本操作 + Cache&DMA 时序图
笔记·stm32·缓存
WangLanguager1 小时前
foc最终要求的是相电压,还是线电压
单片机
LCG元1 小时前
基于STM32CubeMX的HAL库串口通信与DMA传输深度优化
stm32·单片机·嵌入式硬件
嵌入小生0072 小时前
硬件 --- GPIO/中断/定时器/蜂鸣器
单片机·嵌入式硬件·定时器·pwm·gpio·蜂鸣器·中断
forAllforMe2 小时前
LAN9252 从机模式寄存器的配置代码示例
stm32·单片机·嵌入式硬件
不想起床&2 小时前
51单片机
单片机·嵌入式硬件·51单片机
我在人间贩卖青春2 小时前
单片机复位源
单片机·嵌入式硬件·复位源
项目題供诗2 小时前
51单片机入门-温度传感器DS18B20(十三)
单片机·嵌入式硬件·51单片机
莎士比亚的文学花园3 小时前
硬件通信——UART串行口
单片机·嵌入式硬件
guygg883 小时前
基于STM32的贪吃蛇游戏实现(OLED屏)
stm32·嵌入式硬件·游戏