您的位置 首页 方案

什么是串口通讯?根据STM32的printf打印输出

什么是串口通信?基于STM32的printf打印输出-平时我们进行c语言编程的时候会经常用到printf函数进行打印输出,来调试代码。可是这个printf函数C库已经帮我们实现好了,通常只需要直接调用即可,但是如果在一个新的开发平台,如果库没有帮我们实现好,比如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打印输出

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/347506.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部