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模块里,确认下自动填写的信息是否正确,正确的话就点击保存,存入数据库;不正确的话…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

GraphQL 实战篇:Apollo Client 配置与缓存
GraphQL 实战篇:Apollo Client 配置与缓存 上一篇:GraphQL 入门篇:基础查询语法 依旧和上一篇的笔记一样,主实操,没啥过多的细节讲解,代码具体在: https://github.com/GoldenaArcher/graphql…...
前端高频面试题2:浏览器/计算机网络
本专栏相关链接 前端高频面试题1:HTML/CSS 前端高频面试题2:浏览器/计算机网络 前端高频面试题3:JavaScript 1.什么是强缓存、协商缓存? 强缓存: 当浏览器请求资源时,首先检查本地缓存是否命中。如果命…...

内窥镜检查中基于提示的息肉分割|文献速递-深度学习医疗AI最新文献
Title 题目 Prompt-based polyp segmentation during endoscopy 内窥镜检查中基于提示的息肉分割 01 文献速递介绍 以下是对这段英文内容的中文翻译: ### 胃肠道癌症的发病率呈上升趋势,且有年轻化倾向(Bray等人,2018&#x…...

欢乐熊大话蓝牙知识17:多连接 BLE 怎么设计服务不会乱?分层思维来救场!
多连接 BLE 怎么设计服务不会乱?分层思维来救场! 作者按: 你是不是也遇到过 BLE 多连接时,调试现场像网吧“掉线风暴”? 温度传感器连上了,心率带丢了;一边 OTA 更新,一边通知卡壳。…...
大模型真的像人一样“思考”和“理解”吗?
Yann LeCun 新研究的核心探讨:大语言模型(LLM)的“理解”和“思考”方式与人类认知的根本差异。 核心问题:大模型真的像人一样“思考”和“理解”吗? 人类的思考方式: 你的大脑是个超级整理师。面对海量信…...
【Redis】Redis从入门到实战:全面指南
Redis从入门到实战:全面指南 一、Redis简介 Redis(Remote Dictionary Server)是一个开源的、基于内存的键值存储系统,它可以用作数据库、缓存和消息代理。由Salvatore Sanfilippo于2009年开发,因其高性能、丰富的数据结构和广泛的语言支持而广受欢迎。 Redis核心特点:…...

实现p2p的webrtc-srs版本
1. 基本知识 1.1 webrtc 一、WebRTC的本质:实时通信的“网络协议栈”类比 将WebRTC类比为Linux网络协议栈极具洞察力,二者在架构设计和功能定位上高度相似: 分层协议栈架构 Linux网络协议栈:从底层物理层到应用层(如…...