前语:平常咱们进行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:
printf.c:
printf.h:
代码剖析:
1.串口初始化装备
学了STM串口通讯之后,咱们知道装备串口通讯至少要装备:字长(一次传送的数据长度),波特率(每秒传输的数据位数),奇偶校验位,还有中止位。当然我在
装备过程中把他们别离设为8,115200,No ,1。
串口的装备主要与USART_InitTypeDef这个结构体有关,里边存放了操控参数成员:
其实在学习32的时分,一般假如要用到32的内设或许外设,都要进行相应的初始化,也便是相应的结构体成员进行装备,而咱们本非必须完结的printf重定向,也
就用到了串口,所以也要对串口进行初始化!而我是用的USART2,所以要对其进行相应的装备。
查看STM32硬件原理图:
由原理图可知,这个串口是支撑TTL电平的,接纳数据RX是接在PA3管脚上的,发送数据是接在PA2上的。因为我是要输出到PC上的串口终端,所以PA2要
设为复用推挽输出形式,PA3设为复用开漏输入形式。
查看stm32f10x_it.c这个代码可知USART2是挂接在APB1总线上的,GPIO是挂在APB2总线上的,如下所示:
所以咱们在进行时钟初始化的时分要特别留意。
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.效果图
串口调试帮手显现: