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;
			 }
		 
	 //下标最大不超25
	if(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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/77734.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机竞赛 Yolov安全帽佩戴检测 危险区域进入检测 - 深度学习 opencv

1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; Yolov安全帽佩戴检测 危险区域进入检测 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;3分创新点&#xff1a;4分 该项目较为新颖&am…

VUE3 Hooks的面向对象实现方式

本文会以三种形式实现一个组件&#xff0c;该组件实现以下功能&#xff1a; 1.显示一个数字&#xff08;可从prop给初始值&#xff09;和一个添加按钮&#xff1b; 2.点击添加按钮数字增加&#xff1b; 3.当数字大于5时&#xff0c;数字颜色变红&#xff0c;并提交error事件…

Redis详解

Redis 简介 Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的高性能键值对存储数据库&#xff0c;最初由 Salvatore Sanfilippo 开发&#xff0c;它在内存中存储数据&#xff0c;并提供了持久化功能&#xff0c;可以将数据保存到磁盘中&#xff0c;是一种N…

如何利用 ChatGPT 进行自动数据清理和预处理

推荐&#xff1a;使用 NSDT场景编辑器助你快速搭建可二次编辑的3D应用场景 ChatGPT 已经成为一把可用于多种应用的瑞士军刀&#xff0c;并且有大量的空间将 ChatGPT 集成到数据科学工作流程中。 如果您曾经在真实数据集上训练过机器学习模型&#xff0c;您就会知道数据清理和预…

LabVIEW开发设计热稳定器

LabVIEW开发设计热稳定器 使用与PC控制单元接口的电子设备进行数据采集和控制已广泛用于不同的工业应用。精确的温度控制是一个巨大的挑战&#xff0c;这就是为什么一些工业应用需要使用适当的材料和设备比更好的温度精度。 ​ 为了追踪[-50至250C]之间的温度变化&#xff0c…

Kafka第一课概述与安装

生产经验 面试重点 Broker面试重点 代码,开发重点 67 章了解 如何记录行为数据 1. Kafka概述 1.产生原因 前端 传到日志 日志传到Flume 传到HADOOP 但是如果数据特比大&#xff0c;HADOOP就承受不住了 2.Kafka解决问题 控流消峰 Flume传给Kafka 存到Kafka Hadoop 从Kafka…

《cpolar内网穿透》外网SSH远程连接linux(CentOS)服务器

本次教程我们来实现如何在外公网环境下&#xff0c;SSH远程连接家里/公司的Linux CentOS服务器&#xff0c;无需公网IP&#xff0c;也不需要设置路由器。 视频教程 [video(video-jrpesBrv-1680147672481)(type-csdn)(url-CSDN直播https://live-file.csdnimg.cn/release/live/…

UI自动化环境的搭建(python+pycharm+selenium+chrome)

最近在做一些UI自动化的项目&#xff0c;为此从环境搭建来从0到1&#xff0c;希望能够帮助到你&#xff0c;同时也是自我的梳理。将按照如下进行开展&#xff1a; 1、python的下载、安装&#xff0c;python环境变量的配置。 2、pycharm开发工具的下载安装。 3、selenium的安装。…

[低端局][cx32L003] 移植U8G2

文章目录 一、简介&#xff08;1&#xff09;U8g2&#xff08;2&#xff09;U8x8 二、配置要求三、移植步骤&#xff08;1&#xff09;文件准备和添加&#xff08;2&#xff09;实现回调接口(I2C的读写函数)①软件I2C②硬件I2C &#xff08;3&#xff09;功能裁剪① u8g2_d_set…

也许你正处于《孤注一掷》中的“团队”,要留心了

看完这部电影&#xff0c;心情久久不能平静&#xff0c;想了很多&#xff0c;倒不是担心自己哪天也成为“消失的yaozi”&#xff0c;而是在想&#xff0c;我们每天所赖以生存的工作&#xff0c;跟电影里他们的工作比&#xff0c;差别在哪里呢&#xff1f; 目录 1. 产品的本质…

2023 年值得关注的 8 个最佳免费开发者工具

开发者工具对开发人员的重要性不言而喻&#xff0c;保持最新工具的更新可以显著提高你的工作效率并简化您的工作流程。随着技术的快速发展&#xff0c;新的开发工具不断被引入市场。今天&#xff0c;我们将分享 2023 年你值得关注的最新开发者工具。 1.Plaky Plaky 是一种基于…

SASS 学习笔记

SASS 学习笔记 总共会写两个练手项目&#xff0c;成品在 https://goldenaarcher.com/scss-study 可以看到&#xff0c;代码在 https://github.com/GoldenaArcher/scss-study。 什么是 SASS SASS 是 CSS 预处理&#xff0c;它提供了变量&#xff08;虽然现在 CSS 也提供了&am…

【rust/egui】(一)从编译运行template开始

说在前面 rust新手&#xff0c;egui没啥找到啥教程&#xff0c;这里自己记录下学习过程环境&#xff1a;windows11 22H2rust版本&#xff1a;rustc 1.71.1egui版本&#xff1a;0.22.0eframe版本&#xff1a;0.22.0rust windows安装参考&#xff1a;这里本文默认读者已安装相关环…

大语言模型之三 InstructGPT训练过程

大语言模型 GPT历史文章中简介的大语言模型的的发展史&#xff0c;并且简要介绍了大语言模型的训练过程&#xff0c;本篇文章详细阐述训练的细节和相关的算法。 2020年后全球互联网大厂、AI创业公司研发了不少AI超大模型&#xff08;百亿甚至千亿参数&#xff09;&#xff0c;…

使用dockerfile手动构建JDK11镜像运行容器并校验

Docker官方维护镜像的公共仓库网站 Docker Hub 国内无法访问了&#xff0c;大部分镜像无法下载&#xff0c;准备逐步构建自己的镜像库。【转载aliyun官方-容器镜像服务 ACR】Docker常见问题 阿里云容器镜像服务ACR&#xff08;Alibaba Cloud Container Registry&#xff09;是面…

ADIS16470和ADIS16500从到手到读出完整数据,附例程

由于保密原因&#xff0c;不能上传我这边的代码&#xff0c;我所用的开发环境是IAR&#xff0c; 下边转载别的博主的文章&#xff0c;他用的是MDK 下文的博主给了你一个很好的思路&#xff0c;特此提出表扬 最下方是我做的一些手册批注&#xff0c;方便大家了解这个东西 原文链…

MySQL 函数

mysql 函数语法 create function 函数名&#xff08;参数名 参数类型&#xff0c;。。。&#xff09; returns type —返回值类型 ----returns 有个 s [characteristics…] begin 函数体 ### 函数体中肯定有 return 语句 end 参数列表 指定参数为 IN | out | INOUT 只对存储过程…

【NAS群晖drive异地访问】使用cpolar远程访问内网Synology Drive「内网穿透」

文章目录 前言1.群晖Synology Drive套件的安装1.1 安装Synology Drive套件1.2 设置Synology Drive套件1.3 局域网内电脑测试和使用 2.使用cpolar远程访问内网Synology Drive2.1 Cpolar云端设置2.2 Cpolar本地设置2.3 测试和使用 3. 结语 前言 群晖作为专业的数据存储中心&…

空气IT

现代社会中&#xff0c;空气质量成为了人们关注的焦点之一。随着工业化的发展&#xff0c;汽车尾气、工厂排放和燃煤等行为导致城市空气污染日益严重&#xff0c;给人们的健康和生活质量带来了极大的威胁。 首先&#xff0c;空气污染对人体健康造成了严重的危害。空气中的颗粒…

分布式 - 消息队列Kafka:Kafka生产者架构和配置参数

文章目录 1. kafka 生产者发送消息整体架构2. Kafka 生产者重要参数配置01. acks02. 消息传递时间03. linger.ms04. buffer.memory05. batch.size06. max.in.flight.requests.per.connection07. compression.type08. max.request.size09. receive.buffer.bytes和 send.buffer.b…