STM32-(串口通信)

什么是通信?
  1. 数据交互
  2. 信息传递
  3. 条件:两个端  发送端  

一、通信基础知识

1、时钟信号划分

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

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

2、通信方式划分

串行通信:指的是同一时刻只能收或发一个bit位信息。因此只用1根信号线即可。

     串行传输:数据一位一位串起来,逐个传输,数据按位顺序传输。

      优点:占用引脚资源少

      缺点:速度相对较慢

     并行通信:指的是同一时刻可以收或发多个bit位的信息,因此需要多根信号线才行

    并行传输:使用多根线同时传输一个字的多个位,如 8 根线一次传输 8 个位。

     优点:速度快

     缺点:占用引脚资源多

3、通信方向划分

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

一根信号线只能单向发送或单向接收

半双工:可以收,可以发,但是不能同时收发, 比如对讲机

一根信号线可以接收数据也可以发送数据,但是两者不能同时进行

全双工:可以在同一时刻既接收,又发送。 手机 

两根信号线,一根发送数据,另一根接收数据,真正实现同时收发数据,速度快

Tips:总线协议(电气协议)补充

TTL电平:数字电路中,由TTL电子元器件组成电路使用的电平。电平是个电压范围,规定输出高电平>2.4V,输出低电平<0.4V。在室温下,一般输出高电平是3.5V,输出低电平是0.2V。最小输入高电平和低电平:输入高电平>=2.0V,输入低电平<=0.8V,噪声容限是0.4V。

 RS-232:RS232电平    

    1:-15~-3V      0:+3~+15V RS232采用负逻辑电平      非法状态:-3 ~ +3V

RS-485 :半双工、是电气协议(逻辑1:+2V–+6V 逻辑0: -6V— -2V)是二线制差分信号,也就是实际传输的数据是通过判断这两条信号线上的电压差来实现的,RS-485总线弥补了RS-232通信距离短,速率低的缺点,RS-485的速率可高达10Mbit/s,理论通讯距离可达1200米;RS-485和RS-232的单端传输不一样,是差分传输,使用一对双绞线

二、USART 

中文参考手册564页

    Universal Synchonous Asynchronous receiver transmitter  

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

UART:支持异步通信(没有时钟线)、全双工 、串行      

三、串口通信协议

数据帧格式:

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

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

数据位:8位/9位

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

奇校验:

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

偶校验:

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

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

注:除了配置协议还需要配置波特率

波特率:每秒传输的数据位数 bps  bit/s          1Byte = 8bit 

常用的:9600bit/s 115200bit/s

四、USART功能框图 

Tx:数据发送端

Rx:数据接收端

流控概念p

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

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

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

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

SCLK:发送器时钟输出引脚。这个引脚仅适用于同步模式。(UART是异步通信)

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

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

五、相关寄存器 

串口控制寄存器 

USART_CR 决定帧格式:起始位+数据位+校验位+停止位

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

USART_CR1

USART_CR2

USART_CR3

 波特率寄存器

USART_BRR 决定通信速度:bit/s

   中断和状态寄存器 

USART_ISR

数据接收寄存器 

         USART_RDR               决定接收的数据:将要接收数据的读取

   数据发送寄存器  

USART_TDR 决定发送的数据:将要发送的数据写入

六、串口发送实验

实验要求

             通过单片机以1s间隔向电脑发送“helloworld”

6.1 观察实物

找到通信接口    丝印“P4”

6.2 分析原理图

CH340:电平转换芯片,可以转换TTL电平—USB电平。(3.3V------->12V)

需要安装驱动

数据选择/多路复用器

MX配置

初始化代码分析

6.4 代码编写

  1. 实现单个字符发送函数uart_putchar();

2)实现字符串发送函数uart_puts();

void uart_putchar(uint8_t ch)
{while(!(USART1->ISR & (1<<7))){}	//等待发送寄存器为空//ISR的第7位为1,说明发送数据寄存器为空,此时再写入要发送的数据//当发送数据寄存器为空时,while(!1);跳出循环,向下执行
	USART1->TDR = ch;
}
void uart_puts(uint8_t *p)
{while(*p){uart_putchar(*p);
		p++;}
}

七、串口收发实验

实验要求

通过串口助手向单片机发送数据,单片机接收到数据后原样返回。

  1. 实现字符接收函数 uart_getchar()

  1. 实现字符串接收函数 uart_gets()

void uart_putchar(uint8_t ch)
{while(!(USART1->ISR & (1<<7))){}	//等待发送寄存器为空//ISR的第7位为1,说明发送数据寄存器为空,此时再写入要发送的数据//当发送数据寄存器为空时,while(!1);跳出循环,向下执行
	USART1->TDR = ch;
}
void uart_puts(uint8_t *p)
{while(*p){uart_putchar(*p);
		p++;}
}uint8_t uart_getchar()
{uint8_t c;while(!(USART1->ISR & (1<<5))){}
= USART1->RDR;return c;
}void uart_gets(uint8_t *p)
{uint8_t ch;while(1){
		ch = uart_getchar();if(ch != '\n')		//将回车作为输入结束标志{*= ch;}else{*= '\0';			//填充字符串的结束标志break;}
		p++;}
}

八、printf的重定向

int  printf(const char * format,...)

printf函数底层调用的是fputc函数,fputc是将要发送的数据写入到标准输出流stdout

int fputc(int /*c*/, FILE * /*stream*/) 

        因此如果想让printf将数据输出到串口,需要重写fputc  

WEAK弱符号

weak 顾名思义是“弱”的意思,所以如果函数名称前面加上__weak 修饰符,我们一般称这个函数为“弱函数”。

加上了__weak 修饰符的函数,用户可以在用户文件中重新定义一个同名函数,最终编译器编译的时候,会选择用户定义的函数,如果用户没有重新定义这个函数,那么编译器就会执行__weak 修饰的函数,并且编译器不会报错。

int fputc(int ch,FILE *p)
{while(!(USART1->ISR & (1<<7))){}	//等待发送寄存器为空//ISR的第7位为1,说明发送数据寄存器为空,此时再写入要发送的数据//当发送数据寄存器为空时,while(!1);跳出循环,向下执行
	USART1->TDR = ch;return ch;
}

九、HAL库函数

串口发送函数

HAL_StatusTypeDef HAL_UART_Transmit  (UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size,  uint32_t Timeout) 

         功能:以阻塞模式通过串口发送数据

         参数:UART_HandleTypeDef * huart 设备的句柄

                      uint8_t * pData  要输出的缓存区首地址 

                      uint16_t Size  发送的数据量

                      uint32_t Timeout  超时时间

         返回值:发送状态

串口接收函数

HAL_StatusTypeDef HAL_UART_Receive  (UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size,  uint32_t Timeout) 

          功能:以阻塞模式通过串口接收数据

         参数:UART_HandleTypeDef * huart 设备的句柄

                      uint8_t * pData 输入缓存区首地址 

                      uint16_t Size  接收的数据量

                      uint32_t Timeout  超时时间

         返回值:接收状态

STM32常见通信协议

STM32-通信协议

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

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

相关文章

【解决方案】基于物联网表计的综合能源管理方案

安科瑞顾强 为加快推进国家“双碳”战略和新型能源体系建设&#xff0c;努力实现负荷准确控制和用户精细化管理&#xff0c;按照“政府主导、电网组织、政企协同、用户实施”的指导原则&#xff0c;多地成立市/县级电力负荷管理中心&#xff0c;包括浙江宁波、慈溪、辽宁大连、…

Java——》JSONObjet 数据顺序

推荐链接&#xff1a; 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…

1_企业架构之LNMP

公司企业架构LNMP(单点服务器部署) 学习目标和内容 1、能够描述项目流程 2、能够了解PV、QPS、DAU等参数 3、能够实现服务器基本环境配置 4、能够部署配置MySQL生产环境 5、能够部署配置Nginx生产环境 6、能够部署配置PHP生产环境 7、能够理解PHP-FPM和Nginx关联关系 8、能够配…

思维模型 逆向思维

本系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。弱者道之用反者道之动。 1 逆向思维的应用 1.1 历史典故 1 曹冲称象 这个故事讲述的是曹操的儿子曹冲如何利用逆向思维解决了称大象重量的难题。曹冲没有直接去称大象的重量&#xff0c;…

海云安谢朝海:开发安全领域大模型新实践 人工智能助力高效安全左移

2023年11月29日&#xff0c;2023中国&#xff08;深圳&#xff09;金融科技大会成功举行&#xff0c;该会议是深圳连续举办的第七届金融科技主题年度会议&#xff0c;也是2023深圳国际金融科技节重要活动之一。做好金融工作&#xff0c;需要兼顾创新与安全&#xff0c;当智能体…

在表格中显示字典的内容(根据后端返回的数据)vue3

进入页面&#xff0c;调接口&#xff0c;后端返回数据&#xff0c;indexType为0或者1&#xff0c;要用这个数据显示字典的内容 用插槽拿到数据 写一个函数&#xff0c;在模板中使用 const { proxy } getCurrentInstance(); // 字典-指标类型 const { index_type } proxy.u…

谈谈Listener

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 Tomcat三大组件&#x…

分享82个节日PPT,总有一款适合您

分享82个节日PPT&#xff0c;总有一款适合您 82个节日PPT下载链接&#xff1a;https://pan.baidu.com/s/1boDTl3PiHFXLJ890CoUfJA?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易。…

windows配置go调用python的编译环境

go是支持调用python代码的&#xff0c;之前写了几篇linux的部署教程&#xff0c;因为觉得windows的不复杂就没有写&#xff0c;结果今天新部署一个Windows的环境&#xff0c;有些步骤想不起来了&#xff0c;好记性不如烂笔头&#xff0c;还是记录一下吧。 这些是之前写的linux…

CTF-虚拟机-QEMU-前置知识-操作流程与源码阅读

文章目录 总览内存PCI设备PCI配置空间前64个字节对应源码Memorry空间的BARIO空间的BAR MMIOPMIOIspci访问PCI设备配置空间中的Memory空间和IO空间MMIOPMIO QQM&#xff08;qemu object model&#xff09;简洁概要将 TypeInfo 注册 TypeImpl&#xff1a;ObjectClass的初始化&…

SAS聚类分析介绍

1 聚类分析介绍 1.1基本概念 聚类就是一种寻找数据之间一种内在结构的技术。聚类把全体数据实例组织成一些相似组&#xff0c;而这些相似组被称作聚类。处于相同聚类中的数据实例彼此相同&#xff0c;处于不同聚类中的实例彼此不同。聚类技术通常又被称为无监督学习&#xff0…

深入了解Vue.js:构建现代、响应式的前端应用

文章目录 1. Vue.js简介1.1 安装Vue.js 2. Vue的核心概念2.1 数据驱动2.2 组件化2.3 生命周期钩子 3. Vue的特性3.1 响应式数据3.2 模板语法3.3 组件通信 4. 示例项目结语 &#x1f388;个人主页&#xff1a;程序员 小侯 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &#x1…

Jmeter性能测试 —— 压力模式

压力模式 性能测试中的压力模式有两种。 第一种是并发用户模式&#xff08;虚拟用户模式&#xff09;并发用户是指虚拟并发用户数&#xff0c;从业务角度&#xff0c;也可以理解为同时在线的用户数。 从客户端的角度出发&#xff0c;摸底业务系统各节点能同时承载的在线用户数…

pytorch中Conv1d、Conv2d与Conv3d详解

1 卷积介绍 1.1 什么是卷积 卷积&#xff08;convolution&#xff09;&#xff0c;是一种运算&#xff0c;你可以类比于加&#xff0c;减&#xff0c;乘&#xff0c;除&#xff0c;矩阵的点乘与叉乘等等&#xff0c;它有自己的运算规则&#xff0c;卷积的符号是星号*。表达式…

Linux Makefile的认识及CMake的使用

1 Makefile的作用 Makefile 指的是一个叫 Makefile 的文件,里面提前写了一些指令。每次要自动化的完成一个比较复杂项目的自动编译用的时候,就在命令行输入“make”命令Makefile使用。使用Makefile可以 “智能” 的知道: 1 哪些文件需要先进行编译。 2 当某一文件在某次mak…

Blast中文手册(4)

Extracting data from BLAST databases with blastdbcmd(用blastdbcmd从BLAST数据库中提取数据) Created: June 23, 2008; Updated: January 7, 2021. Extract lowercase masked FASTA from a BLAST database with masking information(从具有掩码信息的BLAST数据库中提取小写掩…

知识管理平台Confluence:win10安装confluence

文章目录 介绍主要功能 安装教程安装java运行平台JRE安装数据库Postgresql在Postgresql创建confluence使用的数据库创建数据库用户创建数据库 安装confluence注册confluence启动confluence 参考链接 介绍 Confluence 是由澳大利亚软件公司 Atlassian 开发的企业协作平台。它提…

2023.11.27 关于 Mybatis 增删改操作

目录 引言 增加用户操作 删除用户操作 修改用户操作 阅读下述文章之间 建议点击下方链接先了解 MyBatis 的创建与使用 MyBatis 的创建与使用 建议点击下方链接先了解 单元测试 的创建与使用 Spring Boot 单元测试的创建与使用 引言 为了方便下文实现增、删、改操作我们先…

推荐3个完美替代 Navicat 的工具

现在企业&#xff0c;mysql数据库用的比较多&#xff0c;mysql数据库客户端的需求也就比较大&#xff0c;navicat就被大家所熟知。 这个工具&#xff0c;确实好用&#xff0c;功能也非常强大&#xff0c;但是&#xff0c;它的强大&#xff0c;是需要付费&#xff0c;或者用一些…

STM32内部温度传感器使用方法详解

STM32内部温度传感器使用方法详解 前言 STM32内部集成了一个片上温度传感器&#xff0c;可以用来测量MCU及周围的温度。测量范围&#xff1a;-40~125&#xff0c;精度1.5℃。虽然精度不高&#xff0c;但在某些应用场景下是够了的&#xff0c;相比于外部接入传感器&#xff0c…