用户名
Email
论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
帖子
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
IT评测·应用市场-qidao123.com技术社区
»
论坛
›
数据库
›
Oracle
›
STM32 两个单片机之间的通讯
STM32 两个单片机之间的通讯
种地
论坛元老
|
2025-3-8 19:12:58
|
显示全部楼层
|
阅读模式
楼主
主题
1696
|
帖子
1696
|
积分
5088
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
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)
:用于多任务通讯管理。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
种地
论坛元老
这个人很懒什么都没写!
楼主热帖
Beta 阶段事后分析
mac下配置Charles,安装证书,连接iOS ...
为什么 SQL 语句使用了索引,但却还是 ...
图的基本术语,邻接矩阵、邻接表表示方 ...
python经典习题(一)
DOS窗口命令和单表简单查询
Archlinux scarlett solo driver insta ...
5.返回值IDCANCEL和CommDlgExtendedErr ...
利用kubernetes中的leader选举机制来完 ...
MySQL实战45讲 10
标签云
AI
运维
CIO
存储
服务器
快速回复
返回顶部
返回列表