STM32 两个单片机之间的通信
STM32 两个单片机之间的通信
原创 HS 平凡灵感码头 2025年03月04日 11:25 广东

以上我们就是有A B两个板子来进行通信,A板将接收按键的键值,然后发送给B板,B板接收键值,然后判断键值控制LED翻转,然后把键值按字符形式发送给PC
主函数展示
#define SENDAint 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)
:用于多任务通信管理。
相关文章:
STM32 两个单片机之间的通信
STM32 两个单片机之间的通信 原创 HS 平凡灵感码头 2025年03月04日 11:25 广东 以上我们就是有A B两个板子来进行通信,A板将接收按键的键值,然后发送给B板,B板接收键值,然后判断键值控制LED翻转,然后把键值按字符形式…...
Linux 下使用traceroute来进行网络诊断分析
简介 traceroute 命令是一种网络诊断工具,用于跟踪数据包从系统到目标服务器的路径。它有助于识别网络延迟和路由问题。 安装 Debian/Ubuntu sudo apt install traceroute -yRHEL/CentOS sudo yum install traceroute -yFedora sudo dnf install traceroute -…...
基于vue框架的游戏商城系统cq070(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
系统程序文件列表 项目功能:用户,分类,商品信息,游戏高手,游戏代练 开题报告内容 基于Vue框架的游戏商城系统开题报告 一、研究背景与意义 随着互联网技术的飞速发展和游戏产业的蓬勃兴起,游戏商城作为游戏产业链中的重要一环,迎来了前所…...
SpringBoot接入DeepSeek(硅基流动版)+ 前端页面调试(WebSocket连接模式)
文章目录 前言正文一、项目环境二、项目代码2.1 pom.xml2.2 DeepSeekController.java2.3 启动类2.4 logback-spring.xml2.5 application.yaml2.6 WebsocketConfig.java2.7 AiChatWebSocketHandler.java2.8 SaveChatSessionParamRequest.java2.9 index.html 三、页面调试3.1 主页…...
idea实现热部署
1.在pom.xml文件添加依赖 java <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional></dependency> 更新可见配置成功: 2.在appli…...
记一次误禁用USB导致键盘鼠标失灵的修复过程
背景说明 在电脑上插入了一个USB hub,然后弹窗提示:“集线器端口上出现电涌”,点开让选择“重置”或者“关闭”,不小心点了关闭,结果这个usb口就被关了,再插任何东西都没反应,找了很多办法都恢…...
0x03 http协议和分层架构
HTTP协议 简介 Hyper Text Transfer Protocol,超文本传输协议,规定了浏览器和服务器之间数据传输的规则 http协议基于TCP协议:面向连接,安全基于请求-响应模型:一次请求对应一次响应HTTP协议是无状态的协议ÿ…...
【leetcode hot 100 189】轮转数组
错误解法一:申请一个数组,第i个数放在新数组的ik或ik-nums.length上 class Solution {public void rotate(int[] nums, int k) {int[] resultsnew int[nums.length];for(int i0; i<nums.length; i){if(ik<nums.length){results[ik] nums[i];}els…...
医药行业哪些招聘管理系统有AI功能?
随着医药行业竞争加剧,企业对高端研发、临床、市场人才的需求日益迫切。传统招聘模式因效率低、成本高、匹配度不足等问题,已难以满足行业需求。2025年,以AI为核心的招聘管理系统成为解决痛点的关键工具。 一、医药行业招聘的痛点与AI解决方案…...
.net8 使用 license 证书授权案例解析
创建 webapi 项目 使用 .NET CLI 创建一个 ASP.NET Core Web API 应用,并添加指定的 NuGet 包,可以按照以下步骤操作: 创建 ASP.NET Core Web API 项目: dotnet new webapi -n WebAppLicense cd WebAppLicense添加 Standard.Li…...
golang的io
https://www.bilibili.com/video/BV1gx4y1r7xb 1. 原生io包 io包是Go语言标准库中底层的I/O接口层,定义了通用的读写规则和错误处理逻辑。每次读写都是直接调用底层系统 I/O,每次读取1字节,系统调用次数多。适用于小数据量、实时性要求高。i…...
全向广播扬声器在油气田中的关键应用 全方位守护安全
油气田作为高风险作业场所,安全生产始终是重中之重。在紧急情况下,如何快速、有效地传达信息,确保人员安全撤离,是油气田安全管理的关键环节。全向广播扬声器凭借其全方位覆盖、高音质输出和强大的环境适应性,成为油气…...
76.读取计时器运行时间 C#例子 WPF例子
TimerManager:一个增强的定时器类,带时间管理功能 在使用定时器时,我们常常需要知道定时器的运行状态,比如它已经运行了多久,或者还剩下多少时间。然而,.NET 的 System.Timers.Timer 类本身并没有直接提供…...
嵌入式开发:傅里叶变换(5):基于STM32,实现CMSIS中的DSP库
目录 步骤 1:准备工作 步骤 2:创建 Keil 项目,并配置工程 步骤 3:在MDK工程上添加 CMSIS-DSP 库 步骤 5:编写代码 步骤 6:配置时钟和优化 步骤 7:调试与验证 步骤 8:优化和调…...
探秘基带算法:从原理到5G时代的通信变革【六】CRC 校验
文章目录 2.5 CRC 校验2.5.1 前言2.5.2 CRC算法简介2.5.3 CRC计算的详细过程2.5.4 CRC校验的两种方法详解**分离比较法****整体运算法****不同位出错与余数的关系****总结** 2.5.5 CRC计算的C实现及工具介绍**C实现CRC计算****CRC计算工具推荐** **2.5.6 总结:CRC校…...
MySQL——DQL、多表设计
目录 一、DQL 1.基本查询 2.条件查询 3.分组查询 4.排序查询 5.分页查询 二、多表设计 1.一对多 2.一对一 3.多对多 一、DQL 1.基本查询 注意: *号代表查询所有字段,在实际开发中尽量少用(不直观、影响效率) 2.条件查询…...
XML 编辑器:全面指南与最佳实践
XML 编辑器:全面指南与最佳实践 引言 XML(可扩展标记语言)编辑器是处理XML文件的关键工具,对于开发人员、系统管理员以及任何需要处理XML数据的人来说至关重要。本文将全面介绍XML编辑器的概念、功能、选择标准以及最佳实践,旨在帮助读者了解如何选择和使用合适的XML编辑…...
【USRP】NVIDIA Sionna:用于 6G 物理层研究的开源库
目录 Sionna:用于 6G 物理层研究的开源库主要特点实现6G研究的民主化支持 5G、6G 等模块化、可扩展、可伸缩快速启动您的研究 好处原生人工智能支持综合研究平台开放生态系统 安装笔记使用 pip 安装基于Docker的安装从源代码安装“你好世界!”探索锡奥纳…...
DeepSeek开源周Day6:DeepSeek V3、R1 推理系统深度解析,技术突破与行业启示
DeepSeek 在开源周第六天再次发文,中文原文、官方号在知乎 DeepSeek - 知乎DeepSeek-V3 / R1 推理系统概览 - 知乎deepseek-ai/open-infra-index: Production-tested AI infrastructure tools for efficient AGI development and community-driven innovation 引言 …...
intra-mart实现logicDesigner与forma联动
一、前言 有一个需求,想实现从页面上传一个excel文件,点击提交,就转发给forma模块,然后用户在forma模块里,确认下自动填写的信息是否正确,正确的话就点击保存,存入数据库;不正确的话…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...
快刀集(1): 一刀斩断视频片头广告
一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...
毫米波雷达基础理论(3D+4D)
3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文: 一文入门汽车毫米波雷达基本原理 :https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...
