单片机--USART

news2024/11/18 16:53:48

目录

【2】USART 

【3】串口通信协议

【4】相关寄存器 

   串口控制寄存器 

   波特率寄存器

   中断和状态寄存器 

​编辑

   数据发送寄存器  

数据接收寄存器 

【5】 USART功能框图

【6】串口发送实验

          实验要求

         1.观察实物

         2.分析原理图

3.STM32CubeMX配置

7、不定长接收

8、重定向


【1】通信的基础知识

  1. 通信:至少有收发两方
  2. 通信方式的划分

同步通信:通信双方根据同步信号通信,比如双方有一个共同的时钟信号(SPI同步通信)

异步通信:通信双方有自己的独立系统时钟,大家约定好通信的速度。异步通信不需要同步信号,但并不是说通信的过程不同步了。(UART)

 

 串行通信:指的是同一时刻只能发送一个bit位,因此只需要一根线也可以

       优点:占用引脚资源少

       缺点:速率慢

并行通信:指的是同一时刻可以发送或者接收多个bit位,所以需要多根数据线

       优点:速率快

       缺点:占用引脚资源多

 单工:要么收,要么发,只能做接受设备或者发送设备。比如:收音机

半双工:可以收,可以发,但是同一时刻只能收或发。比如:对讲机

全双工:可以在同一时刻即接收又发送。比如:手机

【2】USART 

    Universal Synchonous Asynchronous receiver transmitter 通用同步异步接收发射机

  中文参考手册 564页

           USART:   支持同步\异步通信、全双工、串行

            UART :没有信号线,只支持异步通信、全双工、串行

【3】串口通信协议

          数据帧格式:

              空闲状态:信号线保持高电平

              起始位:1位   低电平表示数据包的起始

              数据位:8位or9位

              校验位(可选):奇偶校验

                       奇校验:

                               数据位上的1的个数 + 校验位上1的个数 = 奇数

                       偶校验:

                               数据位上的1的个数 + 校验位上1的个数 = 偶数

              停止位:1位  将电平信号拉高,代表一个数据包发送结束,回到空闲状态。

【4】相关寄存器 

   串口控制寄存器 

             (设备功能初始化、通信帧格式配置)

                USART_CR1  USART_CR2  USART_CR3  

   波特率寄存器

             USART_BRR   

   中断和状态寄存器 

             USART_ISR

   数据发送寄存器  

           USART_TDR

数据接收寄存器 

         USART_RDR

【5】 USART功能框图

Tx:数据发送端

Rx:数据接收端

流控概念

     在两个设备正常通信时,由于处理速度不同,就存在这样一个问题,有的快,有的慢,在某些情况下,就可能导致丢失数据的情况。如台式机与单片机之间的通讯,接收端数据缓冲区已满,则此时继续发送来的数据就会丢失。流控制能解决这个问题

nRTS:请求以发送(Request To Send),n表示低电平有效。当本设备准备好接收新数据时就会将nRTS变成低电平;当接收寄存器已满时,nRTS将被设置为高电平。

nCTS:清除以发送(Clear To Send) 为输入信号,低电平有效。用于判断是否可以向对方发送数据,低电平说明本设备可以向对方发送数据。

该引脚只适用于硬件流控制

SCLK:发送器时钟输出引脚。这个引脚仅适用于同步模式。

发送过程:由CPU和DMA向数据发送寄存器(TDR)中写入要发送的数据,由发送移位寄存器将数据按位移到发送端口输出。

接收过程:由CPU和DMA读取接收数据寄存器(RDR)中的数据。

【6】串口发送实验

          实验要求

                        通过单片机向电脑(串口助手)发送数据

         1.观察实物

              找到通信接口    丝印“P4”

         2.分析原理图

             CH340 : 电平转换芯片,可以转换TTL电平-USB电平。

 数据选择器/多路复用器

 

3.STM32CubeMX配置

  1. 寄存器方式编写发送接受一个字节的函数

//写一个单字节发送的函数
void put(uint8_t ch)
{
	while(!(USART1->ISR & 1<<7)){}
	//判断发送数据寄存器是不是空了
	USART1->TDR=ch;
	//将数据写入到TDR寄存器中
}
int get()
{
	uint8_t ch;
  while(!(USART1->ISR & 1<<5)){}
	//判断接受数据寄存器是不是空了
	ch=USART1->RDR;
	//将数据从RDR寄存器中读出来
	return ch;
}
  1. 寄存器方式编写发送接受一个字节的函数

 HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, 

                                       uint32_t Timeout)

功能:串口发送数据

参数:huart :串口选择(USART1)         pData:需要发送的数据   

         Size:发送多少个数据                       Timeout:超时时间

返回值:成功返回HAL_OK 失败返回HAL_TIMEOUT

 HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size,

                                     uint32_t Timeout)

功能:串口接收数据函数

参数:huart :串口选择(USART1)          pData :接收数据的地址   

          Size:发送多少个数据                      Timeout:超时时间

返回值:成功 :返回HAL_OK      失败 :返回HAL_TIMEOUT

HAL_UART_Receive(&huart1,buf,2,100);
HAL_UART_Transmit(&huart1,buf,strlen(buf),100);
memset(buf,0,sizeof(buf));

7、不定长接收

声明
uint8_t buf[128]={"0 "};//数据缓存区
uint8_t byte;//单个字节缓存区
uint8_t len=0;//接收到的数据长度
写在while
if(HAL_UART_Receive(&huart1,&byte,1,100)==HAL_OK)
//判断接收一个字节是否成功
	{
	   if(byte=='\n')//判断是否结束
			{//如果结束处理数据
				HAL_UART_Transmit(&huart1,buf,len,100);//原封不动回回去
				memset(buf,0,len);//清空缓存区
				len=0;	//长度清0
				}
		else//如果没有接收完成
		{
			buf[len++]=byte;//继续接收,把接收到的数据存储到buf
		 }
}

8、重定向

//printf的重定向
int fputc(int ch,FILE *f)
{
  while(!(USART1->ISR & 1<<7)){}
	//判断发送数据寄存器是不是空了
	USART1->TDR=ch;
	//将数据写入到TDR寄存器中
}
//scanf的重定向
int fgetc(FILE *f)
{
	uint8_t ch;
  while(!(USART1->ISR & 1<<5)){}
	//判断接受数据寄存器是不是空了
	ch=USART1->RDR;
	//将数据从RDR寄存器中读出来
	return ch;
}
scanf("%s",buf);
printf("%s",buf);
HAL_Delay(500);

  1. 编写呼吸灯
  2. 串口发送ON开LED,发送OFF关LED或者(0X550X440XFF表示开灯,0X550X660XFF表示关灯)注:包头 0X55  包尾:0XFF  数据:0X44表示开灯  0X66表示关灯

1.呼吸灯
//自定义延时函数
void Delay(int i)
{
	while(i--);
}



int main()
{
while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		for(int i=0;i<3000;i++)
		{
			HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET);
			HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET);
			HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_RESET);
			Delay(i);
			HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET);
			HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET);
			HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_SET);
			Delay(3000-i);
		}
		for(int i=3000;i>0;i--)
		{
			HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET);
			HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET);
			HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_RESET);
			Delay(i);
			HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET);
			HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET);
			HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_SET);
			Delay(3000-i);
		}
  }
}
 //2.开关灯控制

#include <stdio.h>
#include <string.h>
uint8_t buf[32]={"0"};//数据缓存区
uint8_t byte;//单个字节缓存区
uint8_t len=0;//接收到的数据长度


while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		if(HAL_UART_Receive(&huart1,&byte,1,100)==HAL_OK)
	   {
		    if(byte=='N')
				{
           HAL_UART_Transmit(&huart1,buf,len,100);
					 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2,GPIO_PIN_RESET);
					 memset(buf,0,len);
					 len=0;
				}
				if(byte=='F')
				{
					HAL_UART_Transmit(&huart1,buf,len,100);
					HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2,GPIO_PIN_SET);
					memset(buf,0,len);
					len=0;
				}
		 }
  }

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2022 CCPC-final 总结

赛前 去年 CCPC-final 拿了银牌第二。赛后&#xff0c;我选择退役&#xff0c;另一位队友 George_Plover 选择继续。 今年他队友 Kieray 去组女队了&#xff0c;于是邀请我替补参赛。 赛前一个月&#xff0c;约定好每周末组队训一场&#xff08;在 cf 和 qoj 上&#xff0…

Spring Boot集成Swagger2

文章目录 1.什么是Swagger22.SpringBoot集成Swagger23.Swagger2配置管理(1)对Swagger2信息进行更改(2)swagger配置扫描接口(3)配置api文档分组&#xff08;分组无非就是多个Docket&#xff09;(4)实体类的配置 面试题&#xff1a;如果我们希望Swagger在某一个环境中使用&#x…

自学黑客(网络安全),看完这篇,再去追你的黑客梦!

今天专题是替一些想入门网络安全&#xff0c;但还迷茫不知所措的同学解一解惑。想30天零基础入门网络安全&#xff0c;这些你一定要搞清楚。 一、学习网络安全容易造成的误区 1、把编程当作目的&#xff0c;忽略了它的工具职能 千万不要抱着“以编程为目的&#xff0c;再开始…

C++(2):变量和基本类型

基本内置类型 C定义了一套包括算术类型&#xff08;arithmetic type&#xff09;和空类型&#xff08;void&#xff09;在内的基本数据类型。其中算术类型包含了字符、整型数、布尔值和浮点数。空类型不对应具体的值。 算数类型 算数类型分为两类&#xff1a;整型&#xff0…

Cesium教程(二):Cesium默认控件详解

Cesium初始界面在默认情况下&#xff0c;附带了一些有用的小控件&#xff0c;如下图所示&#xff0c;可以执行一些基本的功能。 1、①Geocoder Geocoder是一种定位搜索工具&#xff0c;它可以定位到查询位置。默认使用微软的Bing地图&#xff0c;若更换其他底图可能出现查找不到…

pnpm命令介绍

一、安装pnpm npm install -g pnpm 二、设置镜像源 pnpm config set registry https://registry.npm.taobao.org/ # 检查 pnpm config get registry 三、常用命令 # 查看ts-node的所有版本 pnpm view ts-node versions # 等价与npm i nodemon -g pnpm add nodemon -g # npm i p…

《深入理解Java虚拟机》 JAVA 字节码指令 基础

1.操作数栈 解释时&#xff0c;JVM会为方法分配一个栈帧&#xff0c;而栈帧又由 局部变量表&#xff0c;操作数帧&#xff0c;方法引用&#xff0c;动态链接 组成 方法中的每条指令执行时&#xff0c;要求该指令的操作数已经压入栈中&#xff1b;执行指令时会将操作数从栈中弹…

美团面试,被拷打了一小时....

刚从美团走出来&#xff0c;被拷打了一小时…越想越觉得可惜&#xff0c;回想面试经过&#xff0c;好好总结了几个点&#xff0c;发现面试没过的主要原因是在几个关键的问题没有给到面试官想要的答案。从而失去了这次宝贵的机会。 根据你的工作经历&#xff0c;说说你对质量保证…

python基础语法(print、数据类型、变量、注释、输入、条件语句)

一、初识编码&#xff08;密码本&#xff09; 计算机中所有的数据本质上都是用0和1的组合来存储的。编码就相当于密码本&#xff0c;在计算机中有多个密码本&#xff1a;utf-8编码、gbk编码等 注意事项&#xff1a;在计算机中若以某个编码形式进行保存文件&#xff0c;以后也…

ERP系统数据丢失的潜在经济损失

随着ERP系统的普及和涉及的范围越来越广&#xff0c;基本覆盖所有行业&#xff0c;ERP系统的数据安全也越来越被重视&#xff0c;关系到企业生命的机密信息都被存储在ERP系统中。 因此&#xff0c;ERP系统里存储的数据一旦泄露和丢失是一件非常可怕的事件。 那么&#xff0c;…

通俗易懂的教你如何使用Java实现快速排序

文章目录 快速排序&#x1f512;题目&#x1f4a1;分析&#x1f511;题解 快速排序 &#x1f512;题目 题目链接&#xff1a;785.快速排序-Acwing题库 &#x1f4a1;分析 基本思想&#xff1a;分治主要步骤 Step1&#xff1a;确定主元。从要划分的数组中选取一个元素作为主元…

python3+pytest+requests+allure+yaml测试框架搭建

目录 设计框架的原则 1.框架整体结构 2.框架各个模块说明 3.示例 3.1 先写一个测试用例 3.2 对上面的用例进行分层封装&#xff08;可根据业务复杂度分两层或者三层&#xff0c;此处演示分三层&#xff09; 3.3生成allure测试报告并查看 设计框架的原则 封装基类方法 对…

第十八章 使用LNMP架构部署动态网站环境

文章目录 第十八章 使用LNMP架构部署动态网站环境一、源码包程序1、源码包的优势2、基本步骤&#xff08;1&#xff09;、下载及解压源码包文件&#xff08;2&#xff09;、编译源码包代码&#xff08;3&#xff09;、生成二进制安装程序&#xff08;4&#xff09;、运行二进制…

VS2022调试Win-flex bison生成的C语言程序

Win-flex bison是flex和bison在Windows平台的一个移植版本&#xff0c;它支持flex&#xff08;快速词法分析器&#xff09;和bison&#xff08;GNU解析器生成器&#xff09;。 Win-flex bison的下载及安装可参看“Windows中使用Lex&#xff08;Win flex-bison&#xff09;”&a…

CIBF2023深圳电池展圆满结束!昂视期待与您下次相会

5月18日&#xff0c;CIBF2023深圳电池展圆满结束&#xff0c;展会为期三天&#xff0c;各位参展商展示了最新技术与产品&#xff0c;并在展位上开展花式互动&#xff0c;现场气氛火热。 作为电池行业的权威展会&#xff0c;CIBF2023深圳电池展为国内外用户、采购商、经销商提供…

cuda编程学习——第二个cuda程序(官方案例分析)!干货向(二)

前言&#xff1a; 最近在做三维重建&#xff0c;尤其是Nerf方面多视角合成工作的时候&#xff0c;意识到了cuda的编程计算可以大大提高其中渲染的计算&#xff0c;最明显的例子是Instant-ngp&#xff0c;Plenoxels等文章&#xff0c;因此后面会学Cuda一段时间&#xff0c;同时…

Python代码最好的加密.pyd——easycython(Windows系统)

1 安装easycython 1.1 建议选用python 3.6及其以下的版本&#xff01;&#xff01; 1.2 CMD命令行 pip install easycython2 安装Visual Studio 2.1 下载 点击链接 https://visualstudio.microsoft.com/zh-hans/free-developer-offers/ 2.2 安装注意事项 记得勾选红色下图的…

渗透测试--3.1.社会工程学攻击

目录 社会工程学攻击 SET介绍 一、建立克隆钓鱼网站收集目标凭证 二、set工具集之木马欺骗实战反弹链接 三、后渗透阶段 1.查看主机系统信息 2.到处用户密码的hash值 3.获得shell控制台 日志清除 四、钓鱼邮件 1、测试邮箱的连通性 2、参数说明 3、Kali 内置了s…

位运算实现加减乘除(自用水文)

目录 位运算实现加法 位运算实现减法 位运算实现乘法 位运算实现除法 代码示例 PS&#xff1a;用位运算实现的加减乘除&#xff0c;其数据都是整型的(int、char、size_t等&#xff09; 位运算实现加法 LeetCode_2.两数相加_小白麋鹿的博客-CSDN博客https://yt030917.blo…

【Jmeter第一章】Jmeter实操详细教程(快速入门)

文章目录 1、前言2、Jmeter介绍3、Jmeter下载安装4、Jmeter快速入门4.1、切换为中文显示4.2、基本使用 总结 1、前言 本篇内容为Jmeter的简单使用介绍&#xff0c;是基础的使用技巧&#xff0c;希望能帮到各位&#xff0c;不足之处还望多多包涵&#xff0c;最后感谢您的阅览。…