八、STM32串口通信

news2024/11/26 10:35:56

目录

一、串口通信

1.1串口通信物理层

1.2USB转串口模块

1.3串口通信的其他应用

1.4串口数据包的基本组成

二、串口的结构体与函数讲解

2.1串口讲解

2.2结构体讲解

2.3串口初始化函数讲解

三、串口发送字符

3.1如何配置串口的发送

3.2项目实战

四、串口的中断接收

4.1项目实战

五、重定向printf串口发送


一、串口通信

1.1串口通信物理层

        串口通讯的物理层有很多标准及变种,我们主要讲解RS-232标准,RS-232标准主要规定了信号的用途、通讯接口以及信号的电平标准。

         两个设备的“DB9接口”之间通过串口信号线建立起来连接,串口信号线中使用“RS-232标准”传输数据信号。由于RS-232电平标准的信号不能直接被控制器直接识别,所以这些信号会经过一个“电平转换芯片”转换成控制器能识别的“TTL标准”的电平信号,才能实现通讯。

TTL电平:数字芯片的电平,单片机。( 0 -  5v )

232电平:电脑串口的电平,负逻辑。(-3 - 15v)

1.2USB转串口模块

  1.  USB转串口模块主要应用于电脑和其他设备的连接。
  2. 使用的时候电脑需要安装电平转芯片驱动。

1.3串口通信的其他应用

  1. 原生串口通信主要用于设备和传感器之间的连接,不需要经过电平转换芯片直接只用TTL电平通信。
  2. GPS模块、串口转wifi模块(ESP8266)、蓝牙模块(HCO5)

1.4串口数据包的基本组成

  1. 起始位:由一个逻辑0的数字位表示(第一个低电平)。
  2. 结束位:由0,5,1,1,5,2个逻辑的数据位表示(高电平)。
  3. 有效数据位:紧跟着起始位的就是有效数据位,长度为5,6,7或8位长。
  4. 校验位:可选,目的为数据抗干扰性。

校验方法有:

  • 奇校验:有效数据和校验位中的 ‘1’ 的个数为奇数。10010110,四个1,校验位为1,加上一个位,九个位传输。
  • 偶校验:有效数据和校验位中的 ‘1’ 的个数为偶数。10010110,四个1,校验位为0,加上一个位,九个位传输。
  • 0校验:检验位总为0。
  • 1校验:检验位总为1。
  • 无校验:数据包不包含校验位。

二、串口的结构体与函数讲解

2.1串口讲解

  • USART:通用同步异步收发器
  • UART:通用异步收发器
  • nRTS:请求发送
  • nCTS:请求接收
  • 区别:USART指单片机的一个IO端口模块,可以根据需要配置成同步模式(SPI,IIC),也可以配置成异步模式(UART),可以理解为USART为SPI、IIC对等的“协议”。UART则不是一个协议,为一个实体。

2.2结构体讲解

typedef struct
{
  uint32_t USART_BaudRate;            //波特率    配置波特率 115200/9600

  uint16_t USART_WordLength;          //字长      配置控制数据位的字长:八位/九位 

  uint16_t USART_StopBits;            //停止位    配置停止位0.5,1,1,5,2

  uint16_t USART_Parity;              //校验位    配置校验位 无,奇,偶
 
  uint16_t USART_Mode;                //USART模式 配置工作模式 收/发

  uint16_t USART_HardwareFlowControl; //硬件控制流              
} USART_InitTypeDef;
typedef struct
{
  uint16_t USART_Clock;     //同步时钟              配置是否打开

  uint16_t USART_CPOL;      //极性                  配置串口空闲为低电平

  uint16_t USART_CPHA;      //相位                  配置选择边沿

  uint16_t USART_LastBit;   //最后一个位的时钟脉冲   配置使能还是关闭

} USART_ClockInitTypeDef;

2.3串口初始化函数讲解

//初始化函数
void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct);

//串口使能函数
void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState);

//中断配置函数
void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState);

//串口发送函数
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);

//串口接收读取函数
uint16_t USART_ReceiveData(USART_TypeDef* USARTx);

//获取相应的串口标志位
FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);

//中断状态位获取
ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT);

三、串口发送字符

3.1如何配置串口的发送

  1. 配置时钟:GPIO的时钟,串口的时钟,引脚复用的时钟。
  2. 配置GPIO的结构体。
  3. 配置串口的结构体。
  4. 串口的发送。
FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);//判断串口当前的状态

3.2项目实战

 stm32f103c8t6: stm32f103c8t6各种外设的学习 - Gitee.com

四、串口的中断接收

4.1项目实战

在配置好串口后,如果需要串口的中断接收,则只需要

  1. 配置嵌套向量中断控制器NVIC
    1. 注意使能 USART1的 接受数据寄存器非空标志位
    2. 注意配置NVIC结构体前,先要配置NVIC中断优先级组。
  2. 配置中断服务函数

8-串口的中断接收 · 宋小康/stm32f103c8t6 - 码云 - 开源中国 (gitee.com)

五、重定向printf串口发送

  1. 要使用printf();需要包含stdio.h,并勾选使用库
  2. 其实在使用printf时,就是在调用fputc。重定向printf的意思是:使用重定向的方法,重启fputc();
  3. usart.c写入函数
    //重定向printf:输出函数
    int fputc(int ch,FILE *f)
    {
    	USART_SendData( USART1, (uint8_t)ch );//将ch转化为无符号整型
    	while( USART_GetFlagStatus( USART1,  USART_FLAG_TXE) == RESET);//判断串口当前的状态
    	return (ch);
    }
    //重定向printf:输入函数
    int fgutc(FILE *f)
    {
    	;
    	while( USART_GetFlagStatus( USART1,  USART_FLAG_RXNE) == RESET);//判断串口当前的状态
    	return (int)USART_ReceiveData( USART1);
    }
    
  4. 主函数就可以使用printf(); 和 putchar();

    #include "stm32f10x.h"
    #include "main.h"
    #include <stdio.h>
    void delay(uint16_t time)
    {
    	uint16_t i = 0;
    	while(time--)
    	{
    		i = 12000;
    		while(i--);
    	}
    }
    
    int  main()
    {
    	usart_init();
    
    	while(1)
    	{
    		printf("加油拿offer!\n");
    		putchar('0');
    		delay(1000);
    	}
    
    		  
    }
    
    
    

    项目实战:7-重定向printf串口发送 · 宋小康/stm32f103c8t6 - 码云 - 开源中国 (gitee.com)

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

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

相关文章

一文搞懂 什么是CPU上下文?为什么要切换?如何减少切换?

最近经常有小伙伴问到的一些问题&#xff0c;比较集中的是关于CPU切换. 实际用C/C&#xff0c;go开发&#xff0c;你会特别注意内存和CPU的使用情况&#xff0c;那些对于CPU使用情况特别关注&#xff0c;或者性能特别关注的朋友可以看看这篇文章&#xff0c;相信看完结尾的示例…

二、Linux文件 - Open函数讲解实战

目录 1.Open函数讲解 2.open函数实战 2.1 man 1 ls 查询Shell命令 2.2 man 2 open 查看系统调用函数 2.3项目实战 2.3.1O_RDWR和O_CREAT 2.3.2O_APPEND的用法 1.Open函数讲解 高频使用的Linux系统调用&#xff1a;open write read close Linux自带的工具&#xf…

C语言实现五子棋(n子棋)

五子棋的历史背景&#xff1a; 五子棋起源于中国&#xff0c;是全国智力运动会竞技项目之一&#xff0c;是一种两人对弈的纯策略型棋类游戏。双方分别使用黑白两色的棋子&#xff0c;下在棋盘直线与横线的交叉点上&#xff0c;先形成五子连珠者获胜。五子棋容易上手&#xff0c…

c/c++开发,无可避免的文件访问开发案例

一、缓存文件系统 ANSI C标准中的C语言库提供了fopen, fclose, fread, fwrite, fgetc, fgets, fputc, fputs, freopen, fseek, ftell, rewind等标准函数&#xff0c;这些函数在不同的操作系统中应该调用不同的内核API&#xff0c;从而支持开发者跨平台实现对文件的访问。 在Lin…

【九宫格坐标排列 Objective-C语言】

一、这个案例做好之后的效果如图: 1.这个下载是可以点击的,当你点击之后,弹出一个框,过一会儿,框框自动消失,这里变成“已安装” 2.那么,我现在先问大家一句话:大家认为在这一个应用里面,它包含几个控件, 3个,哪3个:一个是图片框,一个是Label,一个是按钮, 这…

python学习笔记-查看数据结构、均值、中位数、分位数、众数、离中趋势(标准差、方差、求和、偏态系数、风险系数)正态分布pdf、cdf、ppf

①引入pandas包&#xff0c;命名为pd。 import pandas as pd ②读入HR.csv数据 dfpd.read_csv(“./data/HR.csv”) ③查看是什么结构 type(df) ④查看单个类别satisfaction_level的数据结构 type(df[“satisfaction_level”]) ⑤查看均值的数据结构 type(df.mean()) …

运行Whisper笔记(1)

最近chatGPT很火&#xff0c;就去逛了一下openai的github项目。发现了这个项目。 这个项目可以识别视频中的音频&#xff0c;转换出字幕。 带着一颗好奇的心就尝试自己去部署玩一玩 跟着这篇文章一步步来进行安装&#xff0c;并且跟着这篇文章解决途中遇到的问题。 途中还会遇…

男,26岁,做了一年多的自动化测试,最近在纠结要不要转行,求指点。?

最近一个粉丝在后台问我&#xff0c;啊大佬我现在26了&#xff0c;做了做了一年多的自动化测试&#xff0c;最近在纠结要不要转行&#xff0c;求指点。首选做IT这条路&#xff0c;就是很普通的技术蓝领。对于大部分来说干一辈子问题不大&#xff0c;但是发不了什么财。如果你在…

第015天:将APP发布到应用商店(完结)

应用已经开发出来了&#xff0c;下一步我们需要思考推广方面的工作。那么如何才能让更多的用户知 道并使用我们的应用程序呢&#xff1f;在手机领域&#xff0c;最常见的做法就是将程序发布到某个应用商店中&#xff0c;这 样用户就可以通过商店找到我们的应用程序&#xff0c;…

前端修行 - 与后端配合的那些事情

最近总结一下个人作为前端&#xff0c;与后端、测试、以及产品经理、UI设计之间配合的那些事情&#xff0c;想到哪里说到哪里 1 关于正确认识项目研发一号位都是后端的这个事情 项目研发一号位&#xff0c;在有的公司可能会叫做SDM&#xff08;software development manger&am…

springboot 接入websocket实现定时推送消息到客户端

目录说明代码实现说明 如标题&#xff0c;举例需求场景&#xff1a; 前端与后端websocket连接上后&#xff0c;多用户登录&#xff0c;后端根据不同用户定时发消息给前端用于展示 代码实现 1、 <dependency><groupId>org.springframework.boot</groupId>…

vit-pytorch实现 MobileViT注意力可视化

项目链接 https://github.com/lucidrains/vit-pytorch 注意一下参数设置&#xff1a; Parameters image_size: int. Image size. If you have rectangular images, make sure your image size is the maximum of the width and heightpatch_size: int. Number of patches. im…

git:详解git rebase命令

背景 今天无意中打开 git 官网&#xff0c;发现 git 命令还是很多的&#xff0c;然而我们常用的就那几个&#xff0c;今天来学习一个也不怎么常用的命令 rebase 官网链接 都说学一个东西最好的方式就是读他的 官方文档&#xff0c;这里我读了一遍&#xff0c;把一些核心的地…

读书思考:步步惊心的《技术陷阱》

《技术陷阱》这本书450页&#xff0c;43万字之巨&#xff0c;信息量密密麻麻&#xff0c;采集的资料极其丰富&#xff0c;复习了一遍大停滞、大分流、大平衡、大逆转时代&#xff0c;并展望未来。看完了有很多想法&#xff0c;随手写了下来&#xff0c;希望不是蹭热点。&#x…

vue 最详细教学篇(一)

文章目录前言前景Vue 的长期技术支持 (LTS)、终止支持 (EOL) 及其延长版服务学习vue 要掌握那些技能-为什么学习 vue走进vueHello World 起手提示&#xff1a;示例&#xff1a;示例解析编辑器 VSCodevsCode 插件正式使用 vue.js要使用 vue 就绕不开生命周期 下面是生命周期图&a…

全国青少年编程等级考试scratch一级真题2022年9月(含题库答题软件账号)

青少年编程等级考试scratch真题答题考试系统请点击电子学会-全国青少年编程等级考试真题Scratch一级&#xff08;2019年3月&#xff09;在线答题_程序猿下山的博客-CSDN博客_小航答题助手1点击绿旗&#xff0c;下列哪个选项可以实现播放马叫声并在声音全部播放完后&#xff0c;…

Java常见数据结构的排序与遍历(包括数组,List,Map)

数组遍历与排序 数组定义 //定义 int a[] new int[5]int[] a new int[5];//带初始值定义 int b[] {1,2,3,4,5};赋值 //定义时赋值 int b[] {1,2,3,4,5};//引用赋值 a[6] 1 a[9] 9 //未赋值为空取值 //通过下表取值&#xff0c;从0开始 b[1] 1 b[2] 2遍历 Test p…

C语言操作符详解 一针见血!

目录算数操作符移位操作符位操作符赋值操作符单目操作符关系操作符逻辑操作符条件操作符逗号表达式下标引用、函数调用和结构成员表达式求值11.1 隐式类型转换算数操作符&#x1f4ad; 注意/ 除法 --得到的是商% 取模&#xff08;取余&#xff09;--得到的是余数如果除法操作符…

CentOS 根路径下各个目录的作用及介绍

前言 很多小伙伴刚刚开始接触Linux系统时肯定和我一样&#xff0c;都很懵&#xff0c;黑黢黢的界面&#xff0c;一个个目录&#xff0c;没有图形化界面&#xff0c;看着难受&#xff0c;多接触了一些后会好受一些&#xff0c;不过&#xff0c;对各个目录的了解肯定也很基础&am…

若依框架---PageHelper分页(十)

在前几天的文章中&#xff0c;我们介绍了PageHelper的分页方法&#xff0c;研读代码定位到了ExecutorUtil.pageQuery(...)方法&#xff0c;并阅读到了其中的部分代码。 今天我们将看到重要的SQL修改代码。 getPageSql 我们接着看代码&#xff1a; if (!dialect.beforePage(…