STM32 两个单片机之间的通信

STM32 两个单片机之间的通信

原创 HS 平凡灵感码头 2025年03月04日 11:25 广东

以上我们就是有A B两个板子来进行通信,A板将接收按键的键值,然后发送给B板,B板接收键值,然后判断键值控制LED翻转,然后把键值按字符形式发送给PC

主函数展示

复制代码
#define SENDA
复制代码
int main()
复制代码
{
复制代码
init(115200);
复制代码
init_Usart2(115200);
复制代码
Key_Init();
复制代码
led_init();
复制代码
u8 key;
复制代码
u8 data;
复制代码
while(1)
复制代码
{
复制代码
#ifdef SENDA    //发送版
复制代码
key = key_an();
复制代码
if(key != 0xff) send_Uart2(key);
复制代码
#else //接收板
复制代码
data = rece_Uart2();
复制代码
switch(data)
复制代码
{
复制代码
case 1: LED1_OVERTURN ; send_Uart(data+48); break;
复制代码
case 2: LED2_OVERTURN ; send_Uart(data+48); break;
复制代码
case 3: LED3_OVERTURN ; send_Uart(data+48); break;
复制代码
case 4: LED4_OVERTURN ; send_Uart(data+48); break;
复制代码
}
复制代码
#endif
复制代码
}
复制代码
return 0;
}

关键代码解释

条件编译

ifdef SENDA  // 发送端代码#else  // 接收端代码#endif

通过是否定义 SENDA 宏,编译不同的代码段,实现同一份代码适配发送/接收两种硬件。就是先把A板发送端的代码烧录进去,接着我们把定义的#define SENDA注释掉,就可以把接受端的代码烧录进去,接着就连接两个板子的PA2和PA3。就可以完成通信了。

按键检测

= key_an(); // 获取键值,0xff 表示无按键``if (key != 0xff) send_Uart2(key); // 发送有效键值

发送端通过 key_an() 扫描按键,检测到按键后通过 UART2 发送键值。

LED 控制

case 1: LED1_OVERTURN; send_Uart(data+48); break;

LED1_OVERTURN 是翻转 LED1 状态的宏,send_Uart(data+48) 将接收到的数字转为 ASCII 字符(如 1'1')通过主串口(如 UART1)发送,可能用于调试输出。

1. 单片机通信的关键技术

(1) 硬件接口

单片机之间的通信依赖于 物理层接口,常见的硬件接口包括:

  • UART(串口通信)

    :常用于点对点通信,简单易用,如 PA2(TX) ↔ PA3(RX)

  • I²C(两线通信)

    :适合多个设备通信,比如传感器数据采集。

  • SPI(高速通信)

    :常用于高速数据传输,如屏幕驱动、SD 卡等。

  • CAN(车载总线)

    :用于汽车、工业控制,抗干扰能力强。

  • RS485(长距离通信)

    :适合多机通信,抗干扰能力强。

本次实验采用 UART(串口通信),是一种最基础、最常用的通信方式。


(2) 通信协议

通信协议 规定了数据的格式、传输顺序、错误校验等。常见的协议包括:

  • 自定义协议

    :简单易用,比如本实验中直接传输 按键键值

  • 标准协议

    • Modbus(工业控制协议)
    • MQTT(物联网协议)
    • Zigbee(无线通信协议)

在本实验中,我们使用的是 简单的自定义协议

  • 发送端(A 板):按键值 → 通过 UART 发送

  • 接收端(B 板):解析键值 → 控制 LED 并反馈给 PC


(3) 数据格式与编码

  • ASCII 编码

    :如 1 → '1'data + 48)。

  • 二进制数据

    :直接传输数值,如 0x01, 0x02

  • 帧格式

    • 帧头

      (表示数据起始)

    • 数据

      (按键值)

    • 校验

      (确保数据正确性)

在本实验中:

  • 直接使用 单字节数据 传输 按键值,简单高效。

(4) 波特率、数据格式

  • 波特率(Baud rate)

    :决定数据传输速率,本实验使用 115200

  • 数据格式

    • 数据位

      :8 位

    • 停止位

      :1 位

    • 校验位

      :无校验(更简单)

不同设备通信时,波特率、数据格式必须匹配,否则可能发生数据丢失或乱码。


(5) 数据检测与错误处理

  • 数据帧校验(Checksum)

    :可以防止数据传输错误。

  • 超时机制

    :如果长时间未收到数据,需要重新发送。

  • 去抖动处理

    :防止按键抖动导致误触发。

在本实验中,简单处理:

  • 接收数据后判断是否为有效按键值

    1~4)。

  • 发送 ASCII 数据给 PC,方便调试


2. 学习重点

(1) 串口通信(UART)

  • 熟练掌握 UART 初始化、发送、接收

  • 掌握 串口调试助手 的使用。

  • 理解 波特率、数据格式、校验方式

(2) 按键扫描

  • 理解 按键去抖动 方法(延时法、状态机法)。

  • 能够 检测按键状态 并发送数据。

(3) LED 控制

  • 掌握 GPIO 端口控制

  • 学习 LED 翻转(OVERTURN)实现

(4) 代码优化

  • 掌握 条件编译(#ifdef) ,便于在 发送端/接收端 之间切换。

  • 学习 如何设计通信协议(如加帧头、校验)。

(5) 调试技巧

  • 串口调试助手

    :用于观察数据是否正确。

  • printf 调试

    :在 PC 端输出接收数据,便于分析问题。

  • 逻辑分析仪

    :用于检查信号是否正确(高级调试)。


3. 进阶学习方向

如果掌握了基本的 UART 通信,可以进一步学习:

  1. I²C、SPI 通信

    :用于 LCD 显示、传感器读取等。

  2. RS485、CAN 通信

    :用于工业总线、多设备通信。

  3. 无线通信(BLE、Wi-Fi、LoRa)

    :用于物联网应用。

  4. 嵌入式操作系统(RTOS)

    :用于多任务通信管理。

相关推荐
花落已飘2 小时前
STM32Cubemx配置E22-xxxT22D lora模块实现定点传输
stm32·单片机·嵌入式硬件
BUG_MeDe3 小时前
[51 单片机] --串口编程
单片机·嵌入式硬件
{⌐■_■}3 小时前
【MySQL】与MongoDB的区别,字符集,三范式,存储引擎InnoDB、MyISAM
数据库·mysql·mongodb
华清远见成都中心5 小时前
学单片机能从事什么工作?
单片机·嵌入式硬件
恬淡虚无真气从之8 小时前
MongoDB Chunks核心概念与机制
数据库·mongodb
cykaw259013 小时前
如果STM32板子上晶振不是8MHz而是其他(如12MHz)怎么办?
stm32·单片机·嵌入式·电子
三年呀15 小时前
19.4-STM32接收数据-状态显示在屏幕
stm32·单片机·嵌入式硬件·智能小车
hamburgerDaddy116 小时前
从零开始用react + tailwindcss + express + mongodb实现一个聊天程序(十) 收发消息
前端·javascript·mongodb·react.js·node.js·express
一勺菠萝丶16 小时前
MongoDB 查询语句详解:以 `db.fs.files.find().sort({ _id: -1 }).limit(10)` 为例
数据库·mongodb
晓风伴月17 小时前
单片机应用:定时闪烁的LED小灯的实现
单片机·嵌入式硬件