串行通信是一种数据传输方式,通过逐位(一位接一位)的方式在发送端和接收端之间传输数据。相比并行通信(同时传输多个位),串行通信只使用单个信道传输数据,因此在物理连接和传输线路上更简单、成本更低。
基本原理:
1.数据传输顺序:串行通信按照固定的顺序逐位传输数据,通常是从最高位到最低位或反之。发送端和接收端需要同步传输的速率和数据位数,以确保正确的数据解析和还原。
2.时钟同步:为了确保发送端和接收端的数据同步,通常会使用时钟信号作为参考。发送端根据时钟信号逐位发送数据,接收端根据时钟信号进行采样和解析。
3.编码方式:为了提高传输的可靠性和抗干扰能力,常使用特定的编码方式对数据进行编码和解码。例如,使用差分编码、奇偶校验、CRC等机制来检测和纠正传输错误。
特点:
1.简单性和成本:相比并行通信,串行通信的物理连接和传输线路更简单,通常只需要一对信号线。这降低了硬件设计和成本。
2.长距离传输:串行通信可以通过适当的传输协议和调制技术(如RS-485、光纤传输)实现长距离的数据传输,适用于远距离通信需求。
3.抗干扰能力:串行通信在单个信道上传输数据,相比并行通信具有更好的抗干扰能力。通过使用差分信号传输、编码方式和校验机制等手段,可以提高数据传输的可靠性。
4.适用于低速率通信:串行通信逐位传输数据,适用于低速率的数据传输需求。它可以满足很多应用场景,如传感器数据采集、控制信号传输等。
5.可扩展性:串行通信可以通过串行总线拓展到多个设备,实现多个设备之间的数据交换。常见的串行总线包括SPI、I2C、CAN等。
总的来说,串行通信是一种简单、成本低、适用于长距离和抗干扰的数据传输方式。它在许多领域中得到广泛应用,如计算机通信、工业自动化、汽车电子等。
1.RS-232:RS-232是一种常见的串行通信标准,用于在计算机和外部设备之间进行数据传输。它定义了物理层的电气特性、信号线的连接方式和通信协议。
2.RS-485:RS-485也是一种常见的串行通信标准,用于在多个设备之间进行数据传输。它支持多点通信和差分信号传输,具有更高的抗干扰能力和长距离传输能力。
3.UART:UART(Universal Asynchronous Receiver/Transmitter)是一种通用的异步串行通信接口,用于在计算机和外部设备之间传输数据。它负责串行数据的发送和接收,并处理数据的位数、速率、校验等。
4.SPI(Serial Peripheral Interface):SPI是一种同步串行通信协议,用于在微控制器和外部设备之间进行数据传输。它使用四根信号线(时钟、数据输入、数据输出、片选)来实现高速全双工通信。
5.I2C(Inter-Integrated Circuit):I2C是一种串行通信协议,用于在芯片之间进行数据交换。它使用两根信号线(时钟线和数据线)来传输数据,支持多主机和多从机的通信。
6.Modbus:Modbus是一种通信协议,用于在工业自动化系统中实现设备之间的通信。它支持串行通信(如RS-232、RS-485)和以太网通信,定义了一套数据传输格式和通信规则。
7.CAN(Controller Area Network):CAN是一种广泛应用于汽车和工业领域的串行通信协议。它使用差分信号传输,在多个节点之间实现高速、实时的数据通信。
串口硬件接口是一种用于连接计算机或其他设备与外部设备之间的通信接口。它允许通过串行传输方式在设备之间传输数据。串口接口通常用于连接串口设备,例如串口打印机、调制解调器、传感器、嵌入式系统等。
串口接口通常使用一组称为串行通信线(Serial Communication Lines)的物理线路来传输数据。常见的串口接口标准包括RS-232、RS-485和UART等。
1.RS-232:RS-232是一种常见的串口标准,用于在计算机和外部设备之间进行数据传输。它定义了串口的物理连接和电气特性,包括信号线的连接方式、电平范围和通信协议。RS-232接口通常使用DB-9或DB-25连接器。
2.RS-485:RS-485是一种支持多点通信的串口标准,适用于在多个设备之间进行数据传输。与RS-232相比,RS-485具有更高的抗干扰能力和长距离传输能力。它支持半双工或全双工通信,并使用差分信号传输。
3.UART:UART(Universal Asynchronous Receiver/Transmitter)是一种通用的异步串行通信接口,用于在计算机和外部设备之间传输数据。UART负责串行数据的发送和接收,并处理数据的位数、速率、校验等。UART通常集成在计算机芯片或外部设备中。
串行传输:串口接口逐位传输数据,相比并行传输(同时传输多个位),使用的信道和线路更少,简化了物理连接和线路设计。
可靠性:串口接口通常使用较低的数据传输速率,具有较好的抗干扰能力,适用于工业环境和长距离传输。
简单性:串口接口的硬件设计相对简单,成本较低。它广泛应用于嵌入式系统、传感器、工业自动化等领域。
兼容性:许多设备都支持串口接口,使得不同设备可以通过串口进行连接和通信。(不太重要)
RS-232:之前的是25针,采用的是DB-25连接,后来改成了DB-9,在投影仪通信上很常见。如图:
RS-485:其实主机的通信方式仍然是RS-232,但是由于RS-232的通信距离很短,原因是232规定的电压范围在-12~+12v,在传输的过程中会因为电压衰减、噪声干扰导致电压流失,距离太远则不能达到通信时所需的电压差,因此采用485通信方式,其原理就是在232屁股后面加一个RS-232/RS485通信转换器,到接收端再用转换器转换过来,如图所示
UART:UART的通信方式一般是D9,通信协议为RS-232,有的为了传输方便也采取USB传输。
DB-9和DB-25的引脚功能图
UART:
RX——接收数据
TX——发送数据
GND——接地
波特率简单来说就是传播速度,每秒间传播的比特数。
其影响就是决定了串口上传播数据的速度以及不同的通信方式都有波特率的兼容性,一般支持多个传输速率,如果主机和从机的传播速率不同,有可能无法收到数据或数据乱码。
简单来说数据位是每个字符传输时候所需要的位数,一般有5、6、7、8,常用的是8位数据位传输。
停止位就是在数据位后面多那么1、2位,增大数据传输的容错率,《信号论与编码》一书中有提,在数据传输的过程中可能因为某种原因而导致数据的传输错误,例如噪声导致某一位位反转,本来传输的是11100111,结果成11000111,此时有一位发生了反转,在停止位能够及时发现并修正,大大提高了数据传输的容错率。
校验位就是校验用的嘛,不过可以做标记之后详细说,因为校验位的校验方式有很多种:奇校验、偶校验、无校验等。
数据流控制:其实这个大家可以根据自己的理解,简单解释-举个栗子:数据流可以看作是水流,一方放水,一方接水,当接水这边由于某些原因无法按照原来的速率接水或者是无法接水,会给放水的一个信号——数据流控制信号,告诉他我这接不了了。
常用的流控制协议,如XON/XOFF、RTS/CTS、DTR/DSR等。
硬件握手信号:是通过硬件层面的某根线来控制数据流,常见的硬件握手信号包括(可以比对DB-9的线和DB-25的线):
RTS/CTS:用于数据流控制,如上述所述。
DTR/DSR:用于指示数据终端设备(DTE)和数据通信设备(DCE)之间的连接状态。当DTE和DCE都准备好进行通信时,DTR和DSR信号线都处于高电平状态。
CD(Carrier Detect):用于指示DCE设备是否检测到数据调制解调器的载波信号。
硬件握手信号的使用需要硬件支持,并且发送端和接收端之间需要进行正确的线路连接和配置。通过硬件握手信号,发送端和接收端可以进行握手协商,确保数据传输的可靠性和正确性。
起始位(Start Bit)
数据位(Data Bits)
校验位(Parity Bits)
停止位(Stop Bits)
奇偶校验位(Odd/Even Parity Bit)
如ASCII、二进制等。
以个人——空气质量检测仪项目——串口配置——主控芯片为STM32芯片
void USART_Config(void)
{
GPIO_InitTypeDef GPIO_InitStruct={0};
USART_InitTypeDef USART_InitStruct={0};
//开启GPIOA和USART1时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE);
//配置IO口
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出模式
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9;
GPIO_Init(GPIOA,&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;//浮空输入模式
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10;
GPIO_Init(GPIOA,&GPIO_InitStruct);
//配制串口
USART_InitStruct.USART_BaudRate=115200;//波特率
USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//不使用硬件流控制
USART_InitStruct.USART_Mode=USART_Mode_Rx | USART_Mode_Tx;//同时开启接受和发送
USART_InitStruct.USART_Parity=USART_Parity_No;//不使用奇偶校验
USART_InitStruct.USART_StopBits=USART_StopBits_1;//1位停止位
USART_InitStruct.USART_WordLength=USART_WordLength_8b;//8位字长
USART_Init(USART1,&USART_InitStruct);
//使能串口
USART_Cmd(USART1,ENABLE);
USART_NVICConfig();
}
串口发送字符
//串口发送单个字符
void USART1_SendData(uint8_t data)
{
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);//判断数据是否可以发送
//USART1->DR=data;//寄存器模式发送
USART_SendData(USART1,data);//库函数模式发送
}
//串口发送字符串
void USART1_SendStr(uint8_t *data)
{
while(*data!='\0')
{
USART1_SendData(*data);
data++;
}
}
串口中断和数据校验就不写啦,不同环境的配置也不一样
使用串口调试工具进行数据监控和分析。
常见的串口通信故障和排查方法。
如何处理噪声、干扰和传输错误。
串口与外部设备的连接,如传感器、显示器、打印机等。
嵌入式系统中的串口通信应用。
远程控制和监控系统中的串口通信应用。
乐,这篇文章托了一周每天打开关上,打开关上的,我真服喽我自个,主要是我对串口通信的认识很少,而串口通信的东西又不单单是一个USART这么简单,所以我就搜罗了很多概念+理解,本文中有参考电子发烧友微信公众号的知识点汇总:https://mp.weixin.qq.com/s/CsNEtUk9SJAtXq_uT2sUKQ,连接在这里大家可以自己看。
另外我写本篇文章的时候居然想起来我大三学期学习的信号论与编码的知识,当时只顾学习,却不能体会到实际运用中的道理,简单来说就是纸上谈兵啦,甚至算不上,因为我都不会用。没想到毕业后居然能够与以前的知识联系起来,所以不要因为你觉得读完一本书没用,读书是为了增长见识的,说不定在某个时刻就能用上