(五)、串口

      1、串口通信简介

       制定通信的规则,通信双方按照协议规则进行数据收发,将一个设备的数据传送到另一个设备,扩展硬件系统,串口USART有两根通信线Tx、Rx,可同时双向通信,称之为全双工,像I2C只有一根数据线只能收或者发,之为半双工。

       同步即有一根时钟线,如SCL、SCLK时钟线,据时钟线指引采样数据;异步无时钟线,需要双方约定采集频率,按照约定收发数据。在蓝桥杯中就需要约定运行频率、波特率等。

       单端就是引脚的电平为对地的电压差,必须共地,差分就是根据两个线的电压差来传输数据。

                             图 九 串口简介

 

       2、串口通信结构图

        蓝桥杯中可以理解设备一为电脑、设备二为单片机,Tx、Rx必须交错连接,主机设备给串口进行供电。我们一般选用串口一以定时器二为发生器,波特率就是传输速度一般选用9600,在STC_ISP中串口波特率计算器中按如图所示配置(图 十一)生成代码,生成后要打开总中断与串口使能(EA = 1; ES = 1)。这样我们就约定好了采集频率,可以进行下一步收发。

 

                        图 十 串口通信结构图

                        图 十一 串口配置

       3、发送代码展示

        第一个USART1_Init就是 软件生成的,自行添加EA = 1;ES =1,下面一个函数简单来讲就是把串口一发送映射到printf上,通过printf来发送,而printf是可以发送字符串的,借助putchar自动一个个发送,所以此时我们完善putchar函数,将发送数据ch放在SBUF中,通过检测TI发送标志位,发送完成会变成1,所以此时通过while循环等待发送完成,在软件中手动置0。该函数可以外部调用,但需声明stdio.h头文件。

        通过调用printf即可完成发送,如printf(“hsj”);即可向电脑发送hsj字符串数据。在stc-isp中借助USB-CDC/串口助手可验证。配置9600波特率、无校验,一位停止位,选择正确串口com再打开串口即可。

                    图 十二 串口发送代码展示

 

      4、接收代码展示

     接收电脑传输数据时,可能在任何时刻,接收不及时则会导致数据流失,则我们要借助中断暂时跳出主程序,先接收完数据再回到主程序,来完成发送功能。

     中断标志位为4,RI为接收标志位,一旦有数据需要接收,立马变成1。拉高Uart_Recieve_Flag标志位开始计时,在定时器一的中断中if(Uart_Recieve_Flag==1) Uart_Recieve_Trick++;将数据储存到数组中,并手动拉低标志位(RI = 0),如果数据过多我们就通过string.h中库函数memset清空数组。

    在Uart_Proc中检测Uart_Recieve_Index,为0证明无数据直接跳出函数,有数据时判断Uart_Recieve_Trick计时变量,超过10ms表示接收完成停止计时(Uart_Recieve_Flag = 0),开始解析代码,判断接收的数据,完成后通过memset再清空数组。

                      图 十三 接收代码展示1

                     图 十四 接收代码展示2

 

        5、总结

      第一步借助软件配置波特率发生器

       接下来完善putchar函数,借助printf发送

       完成中断处理函数

       完成主程序超时解析部分

 

提供参考代码,希望对读者有帮助

1、串口底层代码

#include <STC15F2K60S2.H>
#include <stdio.h>void Uart1_Init(void)	//9600bps@12.000MHz
{SCON = 0x50;		//8位数据,可变波特率AUXR |= 0x01;		//串口1选择定时器2为波特率发生器AUXR |= 0x04;		//定时器时钟1T模式T2L = 0xC7;			//设置定时初始值T2H = 0xFE;			//设置定时初始值AUXR |= 0x10;		//定时器2开始计时EA = 1;             //打开总中断ES = 1;             //打开串口使能
}extern char putchar (char ch)  //将串口1映射到printf上自动发送字符串
{SBUF = ch;while(TI == 0);   //等待发送TI = 0;           //发送完成并清空标志位return ch;
}

2、处理数据函数

idata unsigned char Uart_Send[15];   //发送数据数组
idata unsigned char Uart_Recieve[10];  //接收数据数组
idata unsigned char Uart_Recieve_Index;  //接收数组指针
idata unsigned char Uart_Recieve_Flag;   //接收标志位,1表示已接收
idata unsigned char Uart_Recieve_Trick;  //计时变量,用于超时解析void Uart_Proc()
{if(Uart_Recieve_Index == 0) return;  //无数据则返回if(Uart_Recieve_Trick >=10)  //超时解析{Uart_Recieve_Flag = 0;  //停止计时Uart_Recieve_Trick = 0;//解析接收内容//解析接收内容memset(Uart_Recieve,0,10);  //清空数组Uart_Recieve_Index = 0;}
}//补充在定时器中需写
//if(Uart_Recieve_Flag == 1) Uart_Recieve_Trick++;

3、中断函数

void Uart_Routine() interrupt 4
{if(RI == 1)  //有数据{Uart_Recieve_Flag = 1;  //开始计时Uart_Recieve_Trick = 0;Uart_Recieve[Uart_Recieve_Index] = SBUF;  //储存数据Uart_Recieve_Index++;RI = 0;   //复位标志位if(Uart_Recieve_Index>10)  //超载则清空数组{memset(Uart_Recieve,0,10);Uart_Recieve_Index = 0;}}}

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/917392.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/917392.shtml
英文地址,请注明出处:http://en.pswp.cn/news/917392.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

错误: 找不到或无法加载主类 原因: java.lang.ClassNotFoundException

背景&#xff1a; 代码没有更改&#xff0c;主类位置也没有移动&#xff0c;运行时突然报找不到或无法加载主类的错误 错误: 找不到或无法加载主类 原因: java.lang.ClassNotFoundException编译器上方显示 Java file is located outside of the module source root so it wont …

Lock 接口及实现类详解:从 ReentrantLock 到并发场景实践

在 Java 并发编程中&#xff0c;除了synchronized关键字&#xff0c;java.util.concurrent.locks.Lock接口及其实现类是另一种重要的同步机制。自 JDK 5 引入以来&#xff0c;Lock接口凭借灵活的 API 设计、可中断的锁获取、公平性控制等特性&#xff0c;成为复杂并发场景的首选…

「iOS」————SideTable

iOS学习前言sideTableSlideTablesSideTableBufSideTable前言 我们在上一篇中&#xff0c;简单的介绍了weak的实现原理。其中弱引用表就是存储在SideTable中的&#xff0c;这里我们来学习了解一下SideTable sideTable sideTable主要用于存储和管理对象的额外信息&#xff0c;…

【PHP】CURL请求第三方API接口

当我们需要调用第三方接口时&#xff0c;就需要使用CURL&#xff0c;通过CURL操作去请求第三方API接口&#xff0c;有的是通过POST方式&#xff0c;有的是通过GET方式&#xff0c;下面介绍一个通用的使用CURL调用API接口的方法。一、CURL操作共两个方法&#xff0c;分别是CURL操…

对于考研数学的理解

文章目录高等数学总结补充说明1. 微分方程与无穷级数的特殊性2. 隐藏的逻辑链条3. 向量代数的桥梁作用核心框架为什么这样设计&#xff1f;结论线性代数核心逻辑框架各讲之间的本质联系1. 行列式 → 矩阵2. 矩阵 → 向量组3. 矩阵 向量组 → 线性方程组4. 矩阵 → 特征值与特征…

基于 Hadoop 生态圈的数据仓库实践 —— OLAP 与数据可视化(四)

目录 四、数据可视化与 Hue 简介 1. 数据可视化简介 &#xff08;1&#xff09;数据可视化的重要性 &#xff08;2&#xff09;数据可视化的用途 &#xff08;3&#xff09;实施数据可视化需要考虑的问题 &#xff08;4&#xff09;几种主要的数据可视化工具 2. Hue 简介…

HarmonyOS 开发:基于 ArkUI 实现复杂表单验证的最佳实践

摘要 在现代应用开发中&#xff0c;表单是最常见的交互方式之一。不管是用户注册、信息录入&#xff0c;还是登录验证&#xff0c;表单的可靠性直接影响用户体验。而在鸿蒙 ArkUI 开发中&#xff0c;虽然表单结构清晰&#xff0c;但要实现 复杂验证&#xff08;比如&#xff1a…

高效游戏状态管理:使用双模式位运算与数学运算

在游戏开发中&#xff0c;状态管理是一个核心问题。无论是任务系统、成就系统还是玩家进度跟踪&#xff0c;我们都需要高效地存储和查询大量状态。本文将深入分析一个创新的游戏状态管理工具类 GameStateUtil&#xff0c;它巧妙结合了位运算和数学运算两种模式&#xff0c;在存…

linux-process-control

Linux进程控制 1. 进程终止 1.1. 进程终止的本质是回收资源 1.1 释放资源 内存资源&#xff1a; 释放进程的地址空间&#xff08;mm_struct&#xff09;&#xff0c;包括代码段、数据段、堆、栈等&#xff0c;通过写时复制&#xff08;CoW&#xff09;共享的页会减少引用计数&a…

Autoswagger:揭露隐藏 API 授权缺陷的开源工具

Autoswagger 是一款免费的开源工具&#xff0c;用于扫描 OpenAPI 文档中列出的 API&#xff0c;查找授权漏洞。 即使在拥有成熟安全团队的大型企业中&#xff0c;这类漏洞仍然很常见&#xff0c;而且尤其危险&#xff0c;因为即使技术水平不高的人也能利用它们。 Autoswagger…

Golang 语言 Channel 的使用方式

一、无缓存 channel无缓冲channel 可用于两个goroutine 之间 传递信号&#xff0c;比如以下示例&#xff1a;顺序打印1 至 100 的奇数和偶数&#xff1a;import ("fmt""time" )func main() {block : make(chan struct{})go odd(block)go even(block)time.S…

Element Plus常见基础组件(一)

基础组件 Button 按钮 一、基础用法 <el-button>默认按钮</el-button> <el-button type"primary">主要按钮</el-button>二、按钮类型 (type) 类型说明示例代码default默认按钮<el-button>默认</el-button>primary主要按钮&a…

sdxl量化加速笔记

文章目录一、量化加速sdxl模型1&#xff09;涉及模型2&#xff09;环境安装3&#xff09;转换模型safetensor to pytorch文件4&#xff09;tensorRT的环境准备&#xff08;1&#xff09;下载tensorRT 10.10&#xff08;2&#xff09;下载cuda一、量化加速sdxl模型 1&#xff0…

西门子 G120 变频器全解析:从认知到参数设置

在工业自动化领域&#xff0c;变频器作为电机驱动的核心设备&#xff0c;其稳定运行与精准控制直接影响生产效率。西门子 G120 变频器凭借可靠性能与灵活配置&#xff0c;成为众多工业场景的优选。本文将从基础认知、操作面板到参数设置&#xff0c;全方位带你掌握 G120 变频器…

【自动化运维神器Ansible】YAML支持的数据类型详解:构建高效Playbook的基石

目录 1 YAML数据类型概述 1.1 为什么数据类型很重要&#xff1f; 1.2 YAML数据类型分类 2 标量类型&#xff08;Scalars&#xff09; 2.1 字符串&#xff08;String&#xff09; 2.2 布尔值&#xff08;Boolean&#xff09; 2.3 数值&#xff08;Numbers&#xff09; 2…

基于岗位需求的康养休闲旅游服务实训室建设方案

一、康养休闲旅游服务实训室建设方案建设需求分析康养休闲旅游服务行业的快速发展对技能人才提出了精准化、场景化的能力要求&#xff0c;康养休闲旅游服务实训室建设方案需紧密对接健康咨询、接待服务、康乐服务等核心岗位群的实际需求。从岗位技能来看&#xff0c;健康咨询岗…

MES 与工业物联网(IIoT)的化学反应:为何是智能工厂的 “神经中枢”?

从“被动救火”到“主动预警”的工厂革命想象一下&#xff0c;当你正在家中熟睡时&#xff0c;智能手环突然震动&#xff0c;提醒你心率异常&#xff1b;早上出门前&#xff0c;手机 APP 告诉你爱车的某个零件即将达到磨损极限&#xff0c;建议及时更换。这些日常生活中的智能预…

工作好用小工具积累

1、内部环境太多&#xff0c;网站导航git地址&#xff1a;https://github.com/hslr-s/sun-panel/releases gitee地址&#xff1a;https://gitee.com/luofei1284999247/sun-panel

智能Agent场景实战指南 Day 26:Agent评估与性能优化

【智能Agent场景实战指南 Day 26】Agent评估与性能优化 开篇 欢迎来到"智能Agent场景实战指南"系列的第26天&#xff01;今天我们将深入探讨智能Agent的评估方法与性能优化技术。构建高效、可靠的智能Agent系统需要完善的评估体系和优化策略&#xff0c;本文将系统…

机器学习——下采样(UnderSampling),解决类别不平衡问题,案例:逻辑回归 信用卡欺诈检测

过采样&#xff1a; 机器学习——过采样&#xff08;OverSampling&#xff09;&#xff0c;解决类别不平衡问题&#xff0c;案例&#xff1a;逻辑回归 信用卡欺诈检测-CSDN博客 &#xff08;完整代码在底部&#xff09; 使用下采样解决类别不平衡问题 —— 以信用卡欺诈识别为…