什么是串口通信?基于STM32的printf打印输出

发布者:WiseThinker最新更新时间:2023-08-31 来源: elecfans关键字:串口通信  STM32  printf打印输出 手机看文章 扫描二维码
随时随地手机看文章

  前言:平时我们进行c语言编程的时候会经常用到printf函数进行打印输出,来调试代码。可是这个printf函数C库已经帮我们实现好了,通常只需要直接调用即可,但是如果在一个新的开发平台,如果库没有帮我们实现好,比如STM32开发板,那么我们怎么实现printf打印输出呢?


  首先我们来了解一下串口通信


  1、什么是串口通信?

  串口通信(Serial Communication),是指外设和计算机间,通过数据信号线、地线等,按位进行传输数据的一种通讯方式。

  串口是一种接口标准,它规定了接口的电气标准,没有规定接口插件电缆以及使用的协议。

  2、串口通信协议

  在串口通信中,常用的协议包括RS-232、RS-422和RS-485。

  •RS-232:标准串口,最常用的一种串行通讯接口。有三种类型(A,B和C),它们分别采用不同的电压来表示on和off。最被广泛使用的是RS-232C,它将mark(on)比特的电压定义为-3V到-12V之间,而将space(off)的电压定义到+3V到+12V之间。传送距离最大为约15米,最高速率为20kb/s。RS-232是为点对点(即只用一对收、发设备)通讯而设计的,其驱动器负载为3~7kΩ。所以RS-232适合本地设备之间的通信。

  •RS-422:最大传输距离为1219米,最大传输速率为10Mb/s。其平衡双绞线的长度与传输速率成反比,在100kb/s速率以下,才可能达到最大传输距离。只有在很短的距离下才能获得最高速率传输。一般100米长的双绞线上所能获得的最大传输速率仅为1Mb/s。

  •RS-485:从RS-422基础上发展而来的,最大传输距离约为1219米,最大传输速率为10Mb/s。平衡双绞线的长度与传输速率成反比,在100kb/s速率以下,才可能使用规定最长的电缆长度。只有在很短的距离下才能获得最高速率传输。一般100米长双绞线最大传输速率仅为1Mb/s。

  3、同步通信?异步通信

  同步通信:是一种比特同步通信技术,要求发收双方具有同频同相的同步时钟信号,只需在传送报文的最前面附加特定的同步字符,使发收双方建立同步,此后便在同步时钟的控制下逐位发送/接收。如:SPI总线,I2C总线。

  异步通信:指两个互不同步的设备通过计时机制或其他技术进行数据传输。也就是说,双方不需要共同的时钟。发送方可以随时传输数据,而接收方必须在信息到达时准备好接收。如:串口(USART)

  4、通信方式

  •单工模式(Simplex Communication):单向的数据传输。通信双方中,一方为发送端,一方则为接收端。信息只能沿一个方向传输,使用一根传输线。双方是固定的。

  •半双工模式(Half Duplex):通信使用同一根传输线,既可以发送数据又可以接收数据,但不能同时进行发送和接收。数据传输允许数据在两个方向上传输,但是,在任何时刻只能由其中的一方发送数据,另一方接收数据。

  •全双工模式(Full Duplex)通信允许数据同时在两个方向上传输。因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力。在全双工模式中,每一端都有发送器和接收器,有两条传输线,信息传输效率高。

  5、数据格式

  (1)起始位:起始位必须是持续一个比特时间的“0”,标志传输一个字符的开始。

  (2)数据位:数据位紧跟在起始位之后,是通信中的真正有效信息。数据位的位数可以由通信双方共同约定,一般可以是5位、7位或8位。传输数据时先传送字符的低位,后传送字符的高位。

  (3)奇偶校验位:奇偶校验位仅占一位,用于进行奇校验或偶校验,奇偶检验位不是必须有的。如果是奇校验,需要保证传输的数据总共有奇数个“1”;如果是偶校验,需要保证传输的数据总共有偶数个“1”

  (4)停止位:停止位可以是是1位、1.5位或2位,可以由软件设定。它一定是“1”,标志着传输一个字符的结束。

  (5)空闲位:空闲位是指从一个字符的停止位结束到下一个字符的起始位开始,表示线路处于空闲状态,必须由高电平来填充。

  了解了串口通信的基础知识之后,我们再来看看STM32开发板上是如何实现串口通信的,我以实现printf重定向为例来进行分析!

  先看代码:

  main.c:

什么是串口通信?基于STM32的printf打印输出

  printf.c:

什么是串口通信?基于STM32的printf打印输出

 

什么是串口通信?基于STM32的printf打印输出

  printf.h:

什么是串口通信?基于STM32的printf打印输出

  代码分析:

  1.串口初始化配置

  学了STM串口通信之后,我们知道配置串口通信至少要配置:字长(一次传送的数据长度),波特率(每秒传输的数据位数),奇偶校验位,还有停止位。当然我在

  配置过程中把他们分别设为8,115200,No ,1。

  串口的配置主要与USART_InitTypeDef这个结构体有关,里面存放了控制参数成员:

  

什么是串口通信?基于STM32的printf打印输出

  其实在学习32的时候,一般如果要用到32的内设或者外设,都要进行相应的初始化,也就是相应的结构体成员进行配置,而我们本次要实现的printf重定向,也

  就用到了串口,所以也要对串口进行初始化!而我是用的USART2,所以要对其进行相应的配置。

  查看STM32硬件原理图:

  

什么是串口通信?基于STM32的printf打印输出

  由原理图可知,这个串口是支持TTL电平的,接收数据RX是接在PA3管脚上的,发送数据是接在PA2上的。由于我是要输出到PC上的串口终端,所以PA2要

  设为复用推挽输出模式,PA3设为复用开漏输入模式。

  查看stm32f10x_it.c这个代码可知USART2是挂接在APB1总线上的,GPIO是挂在APB2总线上的,如下所示:

什么是串口通信?基于STM32的printf打印输出

  所以我们在进行时钟初始化的时候要特别注意。

  2.printf重定向

  其实printf重定向就是我们将printf重新定向到串口,也就是我们可以自己重写C的库函数,当连接器检查到用户编写了与C库函数相同的名字,优先采用

  用户编写的函数这样用户就可以实现对库的修改了。

  printf函数实际是一个宏,最终调用的是 fputc(int ch,FILE *f)这个函数,所以我们需要修改这个函数。

  下面我们着重分析一下fputc函数:

  这个库函数调用了两个ST库函数,分别是:USART_GetFlagStatus()与USART_SendData(),形参ch表示串口将要发送的数据,也就是说。当使用printf()时,它先调用fpuc()函数,然后使用ST库的串口发送函数USART_SendData(),把数据转移到发送数据寄存器TDR.触发我们的串口向PC发送一个相应的数据,调用完USART_SendData()之后,

  使用 while(USART_GetFlagStatus(USART2,USART_FLAG_TC) != SET)语句不停的检查串口的数据是否发送完成的标志位TC,一直检查到标志为“完成”,才进行下一步操作,

  要注意的是USART_SendData()每次只发送一个字节的数据!

  注意:由于fputc()函数的形参调用了C库的FILE,所以在程序中加入stdio.h这个头文件,便且在keil的编译器的设置中勾选Use MicroLIB(使用微库)

  3.硬件连接

  首先硬件上我们将USB转串口线的TXD,RXD,GND,分别接在32开发板USART2上的RXD,TXD,GND。

  由于USART2是TTL电平,所以我们用的usb转串口线一定要是支持TTL电平的,否则串口通信不上!

  4.效果图

  串口调试助手显示:

 

什么是串口通信?基于STM32的printf打印输出


关键字:串口通信  STM32  printf打印输出 引用地址:什么是串口通信?基于STM32的printf打印输出

上一篇:stm32引脚的VCC与VDD如何连接
下一篇:基于STM32单片机的厨房安全系统设计

推荐阅读最新更新时间:2024-11-13 21:44

stm32硬件IIC使用
在许多帖子里看到许多人在使用I2C设备时,都是使用模拟的I2C,因为ST为了规避专利而把它设计得很难用! 本人今天也尝试了一下官方生成的I2C,使用的是CUBEMX生成的I2C,在生成后也遇到了一些小问题,在这里贴出来,为自己和遇到相同问题的人做一个指导(若有问题,望指正!) 首先,在软件中配置生成带有I2C和USART的工程,如下图: 然后使用KEIL打开工程,进行I2C和USART的实验: 以上生成的工程,已经可以使用I2C和USART了。 打印数据到串口,使用以下函数: HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Siz
[单片机]
<font color='red'>stm32</font>硬件IIC使用
STM32烧写方法一】ST-LINK烧写
首先烧写就是将你写好的程序下载到单片机的芯片里,这篇提供2中烧写方法! 第一种为ST-LINK烧写: STLink的JTAG接口在SWD模式下载时理论上需要4根数据线就okay了SWCLK,SWDIO,GND,VCC。 我们只需要上面的 19、20 、7、9 脚即可!至于管口的确定你可以根据上电后的电压来判断! 将上面的口连接到STM32芯片上的对应口,再将芯片上电!记住一定要上电! 然后到keil里做下面选择: ort选择SW 就可以编译烧写程序了!
[单片机]
【<font color='red'>STM32</font>烧写方法一】ST-LINK烧写
STM32中几种流行的开发环境对比
有很多初学者在问:学习STM32,该用哪款开发工具? 我首先说一下我的观点: 没有最好,只有适不适合,适合自己的才是最好的。 开发工具很多,各有各的特点,有优点肯定也有缺点。 本文就来说说当前STM32几种流行的开发环境优缺点~ 一、Keil Keil是一款老牌集成开发环境(IDE),而且是一款通用的IDE,兼容市面上大部分单片机。 01 优点 兼容市面上大部分MCU,换MCU可以不换IDE,不用再费时间熟悉开发环境。 老牌IDE,教程比较多,容易找到各种问题的解决办法。 基于Keil的软件工程很多,直接拿来就能用。 02 缺点 界面不现代化,已被众多网友吐槽。 目录结构不支持多级。 编辑功能还有待改善。
[单片机]
<font color='red'>STM32</font>中几种流行的开发环境对比
STM32电源框架图解析
STM32的工作电压(VDD )为2.0~3.6V,通过内置的电压调节器提供所需的1.8V电源,当主电源VDD 掉电后,通过VBAT 脚为实时时钟(RTC)和备份寄存器提供电源(下图为STM32F1系列电源框架图,STM32基本大同小异) 1、 名词解释 可以看到上图有VDD、VSS、VDDA、VSSA、VREF+等标识,这些是什么意思呢?有什么特点呢?如何看懂STM32系统的电源框架图呢? 首先对名词进行解析,如下所示: VCC 电路的供电正电压 VDDD 芯片的工作数字正电压 GND 电路的供电负电压 VSSD 芯片的工作数字正电压 VDD 芯片的工作正电压 VREF+ ADC基准参考正电压 VSS 芯片的工作负
[单片机]
<font color='red'>STM32</font>电源框架图解析
STM32 DMA使用详解
DMA部分我用到的相对简单,当然,可能这是新东西,我暂时还用不到它的复杂功能吧。下面用问答的形式表达我的思路。 DMA有什么用? 直接存储器存取用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU的干预,通过DMA数据可以快速地移动。这就节省了CPU的资源来做其他操作。 有多少个DMA资源? 有两个DMA控制器,DMA1有7个通道,DMA2有5个通道。 数据从什么地方送到什么地方? 外设到SRAM(I2C/UART等获取数据并送入SRAM); SRAM的两个区域之间; 外设到外设(ADC读取数据后送到TIM1控制其产生不同的PWM占空比); SRAM到外
[单片机]
<font color='red'>STM32</font> DMA使用详解
STM32控制三轴加速度传感器实现分析
买的stm32F107VC开发板,带三轴加速度传感器LIS302DL,附带的示例代码。学习了几天,总结如下。 1。逻辑结构 初始化各外设(RCC,GPIO,SPI,NVIC,I2C,LCD) 检测MEMS并显示检测状态 在死循环中不断查询加速度值并描画。 2。硬件原理 与该程序相关的硬件连接图: MEMS连接图 MEMS引出脚与MCU(左)、IO扩展(右下)连接图 LCD连接图 LCD引出脚与MCU(左)、IO扩展(右上)连接图 从图中可以看出,MEMS使用I2C接口SCL和SDA连接MCU;LCD使用SPI3接口连接MCU。
[单片机]
<font color='red'>STM32</font>控制三轴加速度传感器实现分析
11、STM32的ADC的原理与使用(内附代码)
一、ADC的原理及定义 Analog-to-Digital Converter的缩写。中文译名:模/数转换器或者模拟/数字转换器。是指将连续变量的模拟信号转换为离散的数字信号的器件。其实就是一个取样、量化、编码的一个过程。 典型的模拟数字转换器将模拟信号转换为表示一定比例电压值的数字信号。比如电量、光照传感器等常用。 二、模拟信号 模拟信号是指用连续变化的物理量表示的信息,其信号的幅度,或频率,或相位随时间作连续变化,如目前广播的声音信号,或图像信号等。 三、数字信号 数字信号指幅度的取值是离散的,幅值表示被限制在有限个数值之内。 二进制码就是一种数字信号。二进制码受噪声的影响小,易于有数字电路进行处理,所以得到了广泛
[单片机]
11、<font color='red'>STM32</font>的ADC的原理与使用(内附代码)
意法半导体推出STM32微处理器专用高集成度电源管理芯片
优化的集成化电源管理芯片,内置保护功能,驱动MPU及外设 2024 年 10 月 18 日, 中国——意法半导体 STM32MP2 微处理器配套电源管理芯片STPMIC25 现已上市。 新产品在一个便捷封装内配备 16 个输出通道,可为MPU的所有电源轨以及系统外设供电,完成硬件设计仅需要少量的外部滤波和稳定功能组件。评估板STEVAL-PMIC25V1现已上市,开发者可立即开始开发应用。 新电源管理芯片包含七个 DC/DC 降压转换器和八个低压差 (LDO) 稳压器,还有一个额外的 LDO稳压器为系统 DDR3 和 DDR4 DRAM 提供参考电压 (Vref) 。在八个 LDO稳压器中有一个3.3V 通道专用稳压
[嵌入式]
意法半导体推出<font color='red'>STM32</font>微处理器专用高集成度电源管理芯片
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved