什么是串口通讯接口(什么是串口通讯)

01

什么是串行通信?

串行通信是指仅通过一条接收线和一条发送线就可以按位传输数据的一种通信方式。虽然串行通信比逐字节并行通信慢,但串行通信只需用两根线就能实现数据传输。

典型的串行通信是通过使用三根线来完成的,即地线、发送线和接收线。因为串行通信是异步的,端口可以在一条线路上发送数据,在另一条线路上接收数据。串行通信最重要的参数是波特率、数据位、停止位和奇偶校验。对于需要串口通信的两个端口,这些参数必须匹配,这也是串口通信的前提。

图1:串行通信显示数据传输意图。

02

串行通信的通信协议?

起初,数据是一个简单的模拟信号输出的过程量,然后RS232接口出现在仪器接口。这个接口可以实现点对点通信,但是这种方式可以实现联网功能,导致RS485。

我们知道串行通信的数据传输都是0和1。在单总线、I2C和UART中,逻辑1或逻辑0是由一条线的高低电平来判断的。然而,该信号线的GND形成了与其它设备的共地模式通信。这种共模传输容易受到干扰,抗干扰性能较弱。因此,具有差分通信、多机通信、抗干扰能力强等优点的RS485得到了广泛的应用。

RS485通信的最大特点是传输速度可达10Mb/s以上,传输距离可达3000m左右。需要注意的是,虽然485的最大速度和最大传输距离都很大,但是传输速度会随着距离的增加而变慢,所以我们可以不要两者兼得。

03

串行通信的物理层

串行通信的物理层有许多标准。比如上面说的,我们主要解释RS-232标准,它主要规定了信号的用途、通信接口和信号电平标准。

在上述通信模式中,连接DB9接口两个通信设备的通信是通过串行信号线建立的,它使用RS-232标准来传输数据信号。由于RS-232电平标准的信号可以不能被控制器直接识别,这些信号将被转换成TTL校准的电平信号,控制器可以通过电平转换芯片从而可以实现通信。

下图显示了DB9标准串行通信接口:

DB9引脚描述:

上表显示了计算机侧DB9公接头的标准连接方法。因为两个通信设备之间的收发信号(RXD和TXD)应该是交叉连接的,所以调制解调器侧的DB9母连接器的收发信号连接方法通常与公连接器相反。当两个设备连接后,只需使用直通串行线将它们连接起来。

对于串行线中的RTS、CTS、DSR、DTR和DCD信号,逻辑1表示信号有效,逻辑0表示信号无效。例如,当计算机端控制DTR信号线表示为逻辑1时,用于通知远程调制解调器本地计算机准备好接收数据,0表示还没有准备好。

04

波特率

波特率是指数据信号对载波的调制速率,用单位时间内载波调制状态变化的次数来表示;

比如波特率是9600bps;它代表每秒9600bit的传输,相当于把每秒分成9600等份。

因此,每1位时间是1/9600秒=104.1666.我们。大约0.1毫秒。由于它是9600等份,即每1位后面跟着下一位,因此没有额外的间隔。如果两台设备要实现串行通信,收发机设置的波特率必须相同,否则没有办法实现通信。

通信可以通过一致的波特率来实现:

发送和接收波特率不一致,导致RX端无法正常接收:

05

串行通信的数据结构

起始位:起始位必须是持续一位的逻辑0电平,标志着字符传输的开始。接收方可以使用起始位使其接收时钟与发送方同步的数据。

数据位:da

奇偶校验位:奇偶校验位只占一位,用于奇偶校验。奇偶校验位不是必需的。如果是奇数奇偶校验,需要保证传输的数据总共有奇数个逻辑高位;如果是偶数校验,需要保证传输的数据总共有偶数个逻辑高位。

停止位:停止位可以是1位、1.5位或2位,可通过软件设置。它必须是逻辑1电平,标志着传输一个字符的结束。

空闲位:空闲位是指一个字符的结束停止位和下一个字符的开始,表示该行是空闲的,必须用高电平填充。

06

单双工通信

工作:数据传输只支持单向数据传输;

半双工:它允许数据双向传输,但在某一时刻只能单向传输。实际是切换方向的单工通信,不需要独立的接收机和发射机,可以合并成一个端口;

全双工:允许数据同时双向传输,所以全双工通信是两种单工模式的结合,需要独立的接收机和发射机。

07

STM32中的串行通信

STM32的串行通信接口有两种,分别是UART(通用异步收发器)和USART(通用同步异步收发器)。对于大容量的STM32F10x系列芯片,分别有三个USART和两个UART。

TXD:数据发送引脚;RXD:数据输入引脚

对于两个芯片之间的连接,两个芯片共同接地,TXD和RXD交叉连接,这样两个芯片之间就可以进行TTL级别的通信。

然而,如果芯片连接到PC,上述直接交叉连接可以除了公共接地情况外,不能使用。虽然两者都有TXD和RXD引脚,但PC通常使用RS232接口(9引脚),通常由TXC和RXD的电平转换得到。因此,如果芯片要与PC的RS232接口直接通信,芯片的输入和输出端口需要电平转换为RS232类型,然后交叉连接。两者的等级标准不同:

单片评估标准(TTL级):5V代表1,0V代表0;

RS232电平标准:15/13V表示0,-15/-13表示1。

因此,单片机与PC机的串行通信应遵循:在单片机的串口与上位机给定的RS232口之间,通过电平转换电路实现TTL电平与RS232电平的转换。

如果使用USB转串口也可以实现串行通信,那么USB转串口的电路图如下:

08

STM32串行通信代码

STM32中的串口通信为大家建立了相应的库函数。使用和配置串口时,只需调用库函数,直接配置即可。请参考代码:

01

初始化结构代码

typedef struct { uint 32 _ tUSART _ BaudRate;//波特率

uint16 _ tUSART _ WordLength//字长

uint16 _ tUSART _ StopBits//停止位

uint16 _ tUSART _ Parity//校验位

uint16 _ tUSART _ Mode//USART模式

uint 16 _ tUSART _ hardware flow control;//硬件流量控制}

USART _ InitTypeDef

02

NVIC配置中断优先级

NVIC _配置(无效)

{ NVIC _ InitTypeDefNVIC _ init structure;

nvic _ priority group config(nvic _ priority group _ 2);

nvic _ initstructure。nvic _ IRQ channel=debug _ usart _ IRQ;

nvic _ init structure . nvic _ irqchannelpreemption priority=1;

nvic _ init structure . nvic _ irqchannelsubpriority=1;

NVIC _初始结构。NVIC _ IRQChannelCmd=使能;

NVIC _初始化(NVIC _初始化结构);}

03

USART配置功能

voidDEBUG_USART_Config(void)

{

GPIO _ InitTypeDefGPIO _ init structure;

USART _ InitTypeDefUSART _ init structure;

//打开串口GPIO的时钟debug _ usart _ GPIO _ apbxclkcmd(debug _ usart _ GPIO _ clk,enable);

//配置USARTTx的GPIO为推挽复用模式GPIO _ init structure . GPIO _ pin=debug _ usart _ tx _ GPIO _ pin;

GPIO_InitStructure。GPIO _ Mode=GPIO _ Mode _ AF _ PP

GPIO_InitStructure。GPIO _ Speed=GPIO _ Speed _ 50MHz

GPIO _ Init(DEBUG _ USART _ TX _ GPIO _ PORT,GPIO _ Init structure);

//将USARTRx的GPIO配置为浮点输入模式GPIO _ init structure . GPIO _ pin=debug _ usart _ rx _ GPIO _ pin;

GPIO_InitStructure。GPIO _ Mode=GPIO _ Mode _ IN _ FLOATING;

GPIO _ Init(DEBUG _ USART _ RX _ GPIO _ PORT,GPIO _ Init structure);

//打开串口外设的时钟调试_使用_ apbxclkcmd(调试_使用_时钟,启用):

//配置串口的工作参数

//配置波特率usart _ initstructure .usrt _波特率_ usart _波特率:

//配置针数据字长usart _ initstructure .usrt _ word length=usrt _ word length _ 8b://配置停止位usart _ initstructure .usart _ stopbits=usart _ stopbits _ 1:

//配置校验位usart _ initstructure .usart _ parity=usart _ parity _ no:

//配置硬件流控usart _ initstructure .usrt _硬件低电平控制=usrt _硬件低电平控制_无:

//配置工作模式,收发一起usart _ initstructure .usrt _ mode=usrt _ mode _ rx | usrt _ mode _ tx;

//完成串口的初始化配置use _ init(调试_使用RTX,usart _ initstructure):

//串口中断优先级配置nvic _配置():

//使能串口接收中断usrt _ itconfig(debug _ usrtx,usart _ it _ rxne,启用):

//使能串口

use _ cmd(调试_使用RTX、启用):}

审核彭静