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. 点对点通信 ≠ 远程帧:
  • 点对点通信可通过普通数据帧直接完成,无需远程帧。
  • 远程帧是一种请求机制,而非通信的必要条件。
相关推荐
宵时待雨2 小时前
STM32笔记归纳9:定时器
笔记·stm32·单片机·嵌入式硬件
逐步前行2 小时前
STM32_新建工程(寄存器版)
stm32·单片机·嵌入式硬件
bai5459362 小时前
STM32 CubeIDE 通过PWM占空比控制舵机角度
stm32·单片机·嵌入式硬件
松涛和鸣4 小时前
72、IMX6ULL驱动实战:设备树(DTS/DTB)+ GPIO子系统+Platform总线
linux·服务器·arm开发·数据库·单片机
简单中的复杂4 小时前
【避坑指南】RK3576 Linux SDK 编译:解决 Buildroot 卡死在 host-gcc-final 的终极方案
linux·嵌入式硬件
上海合宙LuatOS5 小时前
LuatOS核心库API——【audio 】
java·网络·单片机·嵌入式硬件·物联网·音视频·硬件工程
Hhh __灏5 小时前
stm32的SRAM内存不足如何分析和优化?堆栈空间如何优化?
单片机
LS_learner5 小时前
Snapd和Apt—Linux 上两种完全不同的软件包管理系统
嵌入式硬件
点灯小铭5 小时前
基于51单片机的双档交流电压表设计与实现
单片机·嵌入式硬件·毕业设计·51单片机·课程设计·期末大作业