STM32 F103C8T6学习笔记7:双机无线串口通信
今日尝试配通俩个C8T6单片机之间的无线串口通信,文章提供原理,源码,测试效果图,测试工程下载:
目录
传输不规范问题:
串口通信资源:
单个串口资源理解:
单片机串口资源:
测试目标与测试硬件连接:
串口初始化与串口中断接收逻辑:
串口初始化:
初步测试能否收发:
阶段测试效果:
规范接收:
几个串口配置方面的注意点:
测试接收:
今日学习加强 :俩片单片机之间的串口通信
单片机的串口通信要想配置好发送与接收,都很简单,如果没有任何意外,我们甚至不需要定义过于规范的 帧头、帧尾 就能实现最简单的俩个单片机的通信;
传输不规范问题:
但在实际的数据传输的过程中,难免会出现:
1.某次传输不小心丢失数据,该次传输所得需作废。
2.发送 或者 接收 了一次偶尔的错误帧。
3.发送方开机比较快,接收方的第一个数据是从中间开始接收的。
............
以上这些不对劲的接收情况的数据是需要直接剔除的,直到接收到正确的数据。
本文会使用一个额外的无线通信模块,大家可从下文了解其配置,如果有自己的无线串口模块,一样配置好接上使用即可,没有无线串口模块,可以勉强使用杜邦线代替,但用杜邦线就模拟不了误传情况了~
DL_20无线串口模块_NULL指向我的博客-CSDN博客
串口通信资源:
单个串口资源理解:
引脚方面,STM32每一个串口都有至多五个引脚:(有的串口只有TX RX )
1.TX 和 RX 发送与接收
2.SCLK 时钟
3.nRTS 请求发送
4.nCTS 允许发送
其中最常用的、必不可少的就是TX与RX了,SCLK是同步时钟,是同步通信时用到的,而我们此次的无线通信属于异步通信,因此用不到,3、4是硬件流控制的引脚,我们也用不到。
单片机串口资源:
这是我之前文章总结的串口资源: STM32 F103 C8T6共有三个串口:

这里其余没有特别需要注意的地方,但在初始化时USART1与2、3有区别,我们除了更改引脚之外,同时需要注意:
USART1是挂载在APB2总线上的外设接口(更快),而其余俩个串口都是挂载在APB1总线上的,因此在初始化开启端口时钟时此处需要额外注意。
测试目标与测试硬件连接:
测试目标:
1.实现俩片单片机的无线通信
2.单片机1的串口1 接无线通信模块,并不断发送数据
3.单片机2的串口1接无线通信模块,接收单片机1的数据,串口2接串口转USB模块,将接受到的数据回传到上位机电脑(注意有没有安装CH340等类似驱动)

串口初始化与串口中断接收逻辑:
串口初始化:
这部分不用细讲,本文主要是写串口接收方逻辑,串口初始化配置方面,不清楚的可以看这篇文章:
STM32 F103C8T6学习笔记3:串口配置—串口收发—自定义Printf函数_NULL指向我的博客-CSDN博客
初步测试能否收发:
单片机1的程序带有一个定时器每秒使用串口1发送12345的程序,串口1是连接了无线模块的,因此同样在串口1连接了无线模块的单片机2会在串口1中断接收到这个数据,而我们先不写任何判断,接收到就返还数据看看~进行初步的测试,这个过程的测试程序,没法存下任何有用的数据,只是简单的返还而已:
单片机1 定时器每秒进中断,使用串口1发送一次12345:

单片机2 串口1中断接收到数据 直接通过串口2链接了串口转USB模块外传给上位机:

阶段测试效果:
下载程序到俩个单片机,查看阶段测试效果:
测试结果中:看似一给单片机1通电了,单片机2就能收到信息反馈给上位机,分毫不差,但这个过程单片机2其实并未将数据保存下来,也就是它并不知道自己接受到的是怎么回事,只是无脑地转发消息罢了:

规范接收:
几个串口配置方面的注意点:
1.俩片单片机收发的时间点要岔开,严格杜绝一个程序都写了收和发,却下载给俩个单片机,这样容易会使得俩个单片机变成“永动机”,卡在那,建议刚开始就单个只管发送,关闭接收中断,另一个只管接收
2.注意其他中断源(尤其是定时器中断),即使是1s进一次定时器中断,也可能会对接收方的串口中断、主程序CPU处理过程 造成毁灭性的打断(时机不凑巧),因此在进入主程序处理接收操作时,应该要想办法关闭其余中断,处理完毕再打开其余中断。
3.注意标志位的正确时机勿忘记清除:中断标志位,数据接收完成标志位,数组缓存下标,甚至是缓存数组也要在处理完后及时清零。
4.其余配置有中断的外设,如果在系统运行时有进入中断的时机,(尤其是定时器溢出中断,这个必定会进)一定要给其配好中断服务函数,并且中断服务函数要写好清除标志位等退出中断的操作,否则程序容易在中断服务函数那卡住。
这样接收,就能将数据存在数组进行下一步处理了:
#include "USART1.h"char usart_buf[25];
char usart_flag=0;
char usart_xb=0;void USART1_IRQHandler(void)
{//接收中断if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET){//清除标志:USART_ClearFlag(USART1, USART_FLAG_RXNE);//数组承接数据usart_buf[usart_xb]=USART_ReceiveData(USART1);//如果接收到数据结尾:if(usart_buf[usart_xb]=='\n' && usart_buf[usart_xb-1]== '\r') {usart_flag=1;}//下标最大不超25if(usart_xb==25) {usart_xb=0;memset(usart_buf,0,sizeof(usart_buf));}//下标移动usart_xb++;}}//确保你已经包含了相应的头文件,例如`#include <stm32f10x.h>`。
// __enable_irq(); // 开启总中断
// __disable_irq(); // 关闭总中断
// __disable_irq(); // 屏蔽中断
// __enable_irq(); // 恢复中断void handle_uart1(void)
{if(usart_flag==1){__disable_irq(); // 屏蔽中断UsartPrintf (USART2,"\r\n");UsartPrintf (USART2,"%s",usart_buf); usart_xb=0;memset(usart_buf,0,sizeof(usart_buf)); //处理完命令别忘了将数组清零,以便接收下个命令usart_flag=0;__enable_irq(); // 恢复中断}
}
测试接收:
接收情况正常:

测试工程下载:
https://download.csdn.net/download/qq_64257614/88212346?spm=1001.2014.3001.5503
相关文章:
STM32 F103C8T6学习笔记7:双机无线串口通信
今日尝试配通俩个C8T6单片机之间的无线串口通信,文章提供原理,源码,测试效果图,测试工程下载: 目录 传输不规范问题: 串口通信资源: 单个串口资源理解: 单片机串口资源…...
开源数据库Mysql_DBA运维实战 (DDL语句)
DDL DDL语句 数据库定义语言:数据库、表、视图、索引、存储过程. 例如:CREATE DROP ALTER DDL库 定义库{ 创建业务数据库:CREAATE DATABASE ___数据库名___ ; 数据库名要求{ a.区分大小写 b.唯一性 c.不能使用关键字如 create select d.不能单独使用…...
分布式 - 消息队列Kafka:Kafka生产者发送消息的分区策略
文章目录 01. Kafka 分区的作用02. PartitionInfo 分区源码03. Partitioner 分区器接口源码04. 自定义分区器05. 默认分区器 DefaultPartitioner06. 随机分区分配 RoundRobinPartitioner07. 黏性随机分区分配 UniformStickyPartitioner08. 为什么Kafka 2.4 版本后引入黏性分区策…...
从源代码编译构建Hive3.1.3
从源代码编译构建Hive3.1.3 编译说明编译Hive3.1.3更改Maven配置下载源码修改项目pom.xml修改hive源码修改说明修改standalone-metastore模块修改ql模块修改spark-client模块修改druid-handler模块修改llap-server模块修改llap-tez模块修改llap-common模块 编译打包异常集合异常…...
探索性测试及基本用例
1 测试决策5要素 测试目标:所有的重要任务都完成了,而剩下没做的事情是比较次要的,我们做到这一点就可以尽早尽可能地降低发布风险。 测试方法:测试是一个不断抉择的过程,测试人员必须理解运行测试用例时和分析现有信…...
MYSQL 作业三
创建一个student表格: create table student( id int(10) not null unique primary key, name varchar(20) not null, sex varchar(4), birth year, department varchar(20), address varchar(50) ); 创建一个score表格 create table score( id int(10) n…...
【深度学习 | 感知器 MLP(BP神经网络)】掌握感知的艺术: 感知器和MLP-BP如何革新神经网络
🤵♂️ 个人主页: AI_magician 📡主页地址: 作者简介:CSDN内容合伙人,全栈领域优质创作者。 👨💻景愿:旨在于能和更多的热爱计算机的伙伴一起成长!!&…...
Kali Linux中常用的渗透测试工具有哪些?
今天我们将继续探讨Kali Linux的应用,这次的重点是介绍Kali Linux中常用的渗透测试工具。Kali Linux作为一款专业的渗透测试发行版,拥有丰富的工具集,能够帮助安全专家和渗透测试人员检测和评估系统的安全性。 1. 常用的渗透测试工具 以下是…...
SpringBoot案例 调用第三方接口传输数据
一、前言 最近再写调用三方接口传输数据的项目,这篇博客记录项目完成的过程,方便后续再碰到类似的项目可以快速上手 项目结构: 二、编码 这里主要介绍HttpClient发送POST请求工具类和定时器的使用,mvc三层架构编码不做探究 pom.x…...
第三章,矩阵,08-矩阵的秩及相关性质
第三章,矩阵,08-矩阵的秩及相关性质 秩的定义1最高阶非零子式定理秩的定义2秩的性质性质1性质2性质3性质4性质5性质6性质7性质8性质9性质10性质11性质12性质12的推论 玩转线性代数(20)矩阵的秩的笔记,相关证明以及例子见原文 秩的定义1 设矩…...
VS2019 + Qt : setToolTip的提示内容出现乱码
VS2019 Qt : setToolTip的提示内容出现乱码 在使用setToolTip()时, setToolTip(QString("asd你好!");标签提示只有英文是对的,中文是乱码! 应该是编码出了问题。默认情况下,Qt使用的是UTF-8编码…...
PO、BO、VO、DTO、DAO、POJO
文章目录 PO(Persistant Object)持久对象DO(Data Object)数据对象AO(Application Object)应用对象BO(Business Object)业务对象VO(Value Object)表现对象DTO&…...
MySQL— 基础语法大全及操作演示!!!(下)
MySQL—— 基础语法大全及操作演示(下)—— 持续更新 三、函数3.1 字符串函数3.2 数值函数3.3 日期函数3.4 流程函数 四、约束4.1 概述4.2 约束演示4.3 外键约束4.3.1 介绍4.3.2 语法4.3.3 删除/更新行为 五、多表查询5.1 多表关系5.1.1 一对多5.1.2 多对…...
Springboot+vue网上招聘系统
系统的首页,头部有三个选项框,第一个是主页,第二个是才艺技能平台,第三个是登录注册。1.1.2 登录注册模块 系统的登录注册包括登录和注册两个部分。所有系统用户使用后台管理功能都需要经行登录,根据选择不同的身份进入…...
奥威BI数据可视化工具:报表就是平台,随时自助分析
别的数据可视化工具,报表就只是报表,而奥威BI数据可视化工具,一张报表就约等于一个平台,可随时展开多维动态自助分析,按需分析,立得数据信息。 奥威BI是一款多维立体分析数据的数据可视化工具。它可以帮助…...
iPhone(iPad)安装deb文件
最简单的方法就是把deb相关的文件拖入手机对应的目录,一般是DynamicLibraries文件夹 参考:探讨手机越狱和安装deb文件的几种方式研究 1、在 Mac 上安装 dpkg 命令 打包 deb 教程之在 Mac 上安装 dpkg 命令_xcode打包root权限deb_qq_34810996的博客-CS…...
手撕单链表
目录 链表的概念和结构 单链表的实现 申请新结点 打印 尾插 头插 尾删 头删 编辑 查找 在pos位置前插入元素 在pos位置后插入元素 删除pos位置的元素 删除pos位置之后的位置的元素编辑 完整代码 SListNode.h SListNode.c 链表的概念和结构 链表是一种物理存储…...
Spring-aop特点,专业术语及案例演示
一.aop简介 AOP(Aspect-Oriented Programming)是Spring框架的一个重要特性,它通过将横切关注点(cross-cutting concerns)从核心业务逻辑中分离出来,以模块化的方式在整个应用程序中重复使用。以下是关于AOP…...
探秘Java的Map集合:键值映射的奇妙世界
文章目录 1. 单列集合 vs. 双列集合2. Map接口:键与值的契约3. 深入探索HashMap3.1 特性与构造方法3.2 常用方法3.3 遍历HashMap 4. 美妙的LinkedHashMap 在Java编程中,集合是不可或缺的重要部分,它为我们提供了各种数据结构和算法的实现。其…...
git权限问题解决方法Access denied fatal: Authentication failed
文章目录 遇到Access denied 的权限问题解决方法1、git的密码修改过,但是本地没更新。2、确定问题,然后增加配置① 查询用户信息②如果名称和email不对,设置名称:③ 检查ssh-add是否链接正常④ 设置不要每次都输入用户名密码 3、配…...
探索液晶仿真负折射的奇妙世界
液晶仿真负折射在光学和材料科学领域,负折射现象一直是一个令人着迷的研究方向。而通过液晶来进行负折射的仿真,更是为这个领域带来了新的活力和可能性。 什么是负折射 通常情况下,当光线从一种介质进入另一种介质时,遵循斯涅尔定…...
Linux系统编程:popen函数捕获命令输出的原理与实践
1. 从system到popen:为什么我们需要捕获命令输出?在Linux系统编程中,调用shell命令是再常见不过的需求。很多开发者第一个想到的就是system()函数——简单粗暴,一行代码就能执行命令。但真正做过实际项目的人都知道,sy…...
智能CPU性能优化工具:释放处理器潜能的系统级解决方案
智能CPU性能优化工具:释放处理器潜能的系统级解决方案 【免费下载链接】CPUDoc 项目地址: https://gitcode.com/gh_mirrors/cp/CPUDoc 当你在游戏中遭遇帧率骤降、视频渲染耗时过长,或是多任务处理时系统响应迟滞,这些问题的根源往往…...
StabilityGuide故障排查终极指南:从OutOfMemoryError到StackOverFlowError的完整解决方案
StabilityGuide故障排查终极指南:从OutOfMemoryError到StackOverFlowError的完整解决方案 【免费下载链接】StabilityGuide 项目地址: https://gitcode.com/gh_mirrors/st/StabilityGuide StabilityGuide是阿里巴巴开源的系统稳定性知识库,专注于…...
革命性主题建模工具Top2Vec:自动发现隐藏主题的完整指南
革命性主题建模工具Top2Vec:自动发现隐藏主题的完整指南 【免费下载链接】Top2Vec Top2Vec learns jointly embedded topic, document and word vectors. 项目地址: https://gitcode.com/gh_mirrors/to/Top2Vec Top2Vec是一款革命性的主题建模工具࿰…...
7个终极技巧:提升SwiftyUserDefaults性能,避开常见陷阱
7个终极技巧:提升SwiftyUserDefaults性能,避开常见陷阱 【免费下载链接】SwiftyUserDefaults Modern Swift API for NSUserDefaults 项目地址: https://gitcode.com/gh_mirrors/sw/SwiftyUserDefaults SwiftyUserDefaults是一个为NSUserDefaults提…...
Chord视频分析工具完整指南:支持MOV/AVI/MP4,宽屏界面适配大屏分析
Chord视频分析工具完整指南:支持MOV/AVI/MP4,宽屏界面适配大屏分析 1. 工具概览:本地智能视频分析新选择 Chord视频时空理解工具是一款基于先进多模态架构的本地化智能视频分析解决方案。这个工具最大的特点是完全在本地运行,不…...
HARMONYOS应用实例242:不等式组解集图示
不等式组解集图示 功能:输入两个不等式,自动在数轴上绘制两个解集,并高亮显示其公共部分。这是一个基于 HarmonyOS ArkTS 开发的交互式不等式求解工具,用户可以输入两个不等式(如 x > 2 和 x < 5),系统会自动解析并在数轴上绘制两个解集,同时高亮显示它们的公共部…...
告别Date混乱:kotlinx-datetime 0.6.0版本完全避坑指南
告别Date混乱:kotlinx-datetime 0.6.0版本完全避坑指南 如果你曾在Kotlin项目中处理过跨时区生日提醒、电商促销倒计时或航班时刻转换,大概率体验过被java.util.Date支配的恐惧——隐式时区转换、毫秒值溢出、不可变性问题如同定时炸弹般散落在代码各处。…...
UI-TARS-desktop效果实测:内置Qwen3-4B模型响应速度有多快
UI-TARS-desktop效果实测:内置Qwen3-4B模型响应速度有多快 在当今AI应用日益普及的背景下,响应速度已成为衡量模型实用性的关键指标。本文将带您实测UI-TARS-desktop内置的Qwen3-4B-Instruct-2507模型在实际使用中的响应表现,通过多场景测试…...
