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 通信,可以进一步学习:
-
I²C、SPI 通信
:用于 LCD 显示、传感器读取等。
-
RS485、CAN 通信
:用于工业总线、多设备通信。
-
无线通信(BLE、Wi-Fi、LoRa)
:用于物联网应用。
-
嵌入式操作系统(RTOS)
:用于多任务通信管理。