当前位置:首页 > 嵌入式 > 程序员小哈
[导读]串口通讯简介: 串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式,因为它简单便捷,因此大部分电子设备都支持该通讯方式。 通讯结构 设备内部一般以TTL电平传输,设备之间是通过RS232/RS485电平标准传输。 两个设备或者器件要想实现串口通

串口通讯简介:

串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式,因为它简单便捷,因此大部分电子设备都支持该通讯方式。


通讯结构

设备内部一般以TTL电平传输,设备之间是通过RS232/RS485电平标准传输。
两个设备或者器件要想实现串口通讯,要电平匹配才能够正常通讯。

 

电平标准

根据使用的电平标准不同,串口通讯可分为 RS232标准及TTL标准,具体标准如下:


在电子电路中,模块之间常使用TTL的电平标准,但其抗干扰能力较弱,为了增加串口的通讯距离及抗干扰能力,使用RS-232电平标准在设备之间传输信息,经常使用MA3232芯片对TTL电平及RS-232电平进行相互转换。


协议层

1.数据包

串口通讯的数据包由发送设备通过自身的TXD接口传输到接收设备的RXD接口,在协议层中规定了数据包的内容,具体包括起始位、主体数据(8位或9位)、校验位以及停止位,通讯的双方必须将数据包的格式约定一致才能正常收发数据。


2.波特率

由于异步通信中没有时钟信号,所以接收双方要约定好波特率,即每秒传输的码元个数,以便对信号进行解码,常见的波特率有4800、9600、115200等。STM32中波特率的设置通过串口初始化结构体来实现。


3.起始和停止信号

数据包的首尾分别是起始位和停止位,数据包的起始信号由一个逻辑0的数据位表示,停止位信号可由0.5、1、1.5、2个逻辑1的数据位表示,双方需约定一致。STM32中起始和停止信号的设置也是通过串口初始化结构体来实现。


4.有效数据

有效数据规定了主题数据的长度,一般为8或9位,其在STM32中也是通过串口初始化结构体来实现的。


5.数据校验

在有效数据之后,有一个可选的数据校验位。由于数据通信相对更容易受到外部干扰导致传输数据出现偏差,可以在传输过程加上校验位来解决这个问题。校验方法有奇校验(odd)、偶校验(even)、 0 校验(space)、 1 校验(mark)以及无(noparity)。这些也都可以在串口初始化结构体中实现的。


STM32F103系列单片机共有5个串口:

其中1-3是通用同步/异步串行接口USART(Universal Synchronous/Asynchronous Receiver/Transmitter)

4、5是通用异步串行接口UART(Universal Asynchronous Receiver/Transmitter)。


STM32比51单片机好用的一个地方就是串口比较多,51单片机一般只有2个串口,有时不够用。


下面以USART1为例,说明一下STM32串口设置的一般步骤:

1) 串口时钟使能,GPIO 时钟使能 

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //使能USART1,GPIOA时钟

2) GPIO端口设置

设置发送和接收引脚的信息,将Tx(发送引脚)配置为推挽复用模式用来发送数据,Rx(接收引脚)配置为浮空输入模式用来接收数据。

GPIO_InitTypeDef GPIO_InitStructure;
//USART1_TX GPIOA.9GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9 //USART1_RX GPIOA.10初始化GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10

3)Usart1 NVIC 配置(如果需要开启中断,才进行本步骤的设置)

NVIC_InitTypeDef NVIC_InitStructure;
//Usart1 NVIC 配置NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ; //抢占优先级3NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化NVIC寄存器//如果需要接收串口数据,则开启串口接收中断USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断

4) 串口参数初始化 

USART_InitTypeDef结构体,内部包含串口通讯相关工作参数:

typedef struct {

    uint32_t USART_BaudRate; // 波特率

    uint16_t USART_WordLength; // 字长

    uint16_t USART_StopBits; // 停止位

    uint16_t USART_Parity; // 校验位

    uint16_t USART_Mode; // USART 模式

    uint16_t USART_HardwareFlowControl; // 硬件流控制

} USART_InitTypeDef;


USART_InitTypeDef USART_InitStructure;USART_InitStructure.USART_BaudRate = bound;//串口波特率USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式

USART_Init(USART1, &USART_InitStructure); //初始化串口1

5) 使能串口

USART_Cmd(USART1, ENABLE); //使能串口1

6) 编写串口发送函数

//发送一个字节void USART1_Send_Byte(u8 Data) { USART_GetFlagStatus(USART1, USART_FLAG_TC);  USART_SendData(USART1,Data); while( USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET );}
//发送字符串,遇到字符串结尾标志'\0'结束void USART1_Send_String(u8 *Data) { while(*Data) USART1_Send_Byte(*Data++);}
//按长度发送字符串,这种方法可以发送含0x00的字符串void USART1_Send_String_By_Lens(u8 *Data, int Len){ int i; for(i=0; i<Len; i++) { USART_SendData(USART1, Data[i]); while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET); //串口1发送数据 }}
//重定向printf函数发送字符串,一般使用此函数直接输出打印调试信息,使用方法跟C语言中的使用方法一致。int fputc(int ch, FILE *f){ USART_SendData( DEBUG_USARTx, (uint8_t) ch); /* 等待发送完毕 */ while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET); return ch;}


7) 编写中断处理函数

串口1中断服务程序,此接收的数据是以0x0D、0x0A结尾为标志的数据帧。
void USART1_IRQHandler(void) { u8 Res;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾) { USART_ClearFlag(USART1, USART_IT_RXNE); //清除标志位 Res =USART_ReceiveData(USART1); //读取接收到的数据 if((USART_RX_STA&0x8000)==0)//接收未完成 { if(USART_RX_STA&0x4000)//接收到了0x0d { if(Res==0x0D) USART_RX_STA|=0x4000; else if(Res!=0x0a) USART_RX_STA=0;//接收错误,重新开始 else USART_RX_STA|=0x8000; //接收完成了 } else //还没收到0X0D { if(Res==0x0d) USART_RX_STA|=0x4000; else { USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ; USART_RX_STA++; if(USART_RX_STA>(USART_REC_LEN-1)) USART_RX_STA=0;//接收数据错误,重新开始接收 } } } }}
//接收完数据之后,在main函数中对接收到的数据进行处理。if(USART_RX_STA&0x8000){ //得到此次接收到的数据长度,即USART_RX_BUF数组中的有效数据长度 uart1Len=USART_RX_STA&0x3f; //对接收到的数据进行数据处理,接收的数据暂存在USART_RX_BUF数组中 //... ... USART_RX_STA=0; memset(USART_RX_BUF, 0, sizeof(USART_RX_BUF)); //清空数组 }

串口应用:

  • 与TTL串口传感器或模块直接通讯;

  • 转为RS232与PC通讯;

  • 转为RS485与485部件的传感器或器件通讯;


USB转串口的原理图:

使用CH340C芯片的话,就可以省略外部晶振了,可以节省PCB布局空间;
win7系统一般选择CH340作为USB转串口驱动,Win10系统下选择 CH341驱动作为 USB转串口驱动;


TTL串口转RS232原理图:


TTL串口转RS485原理图:

RS485总线一般使用时默认处于接收状态。



参考资料:

  • 【正点原子】MiniSTM32开发板资料


有啥想玩的模块,留言给我,咱们一起玩


免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭