当前位置:   article > 正文

STM32串口通讯(RS232、RS485、TTL)详解_ttl串口通信

ttl串口通信

前言

STM32串口(Serial Communication Interface)STM32微控制器中用于串行通信的接口,通常指的是USART(通用同步异步收发器)或UART(通用异步收发传输器)。这些接口允许STM32微控制器与其他设备(如计算机、其他微控制器、传感器等)进行串行数据交换。

串行通信一般是以帧格式传输数据,数据一帧一帧的被传输,每帧包含有起始信号、数据信息、校验信息、停止信号。

一、物理层

1.RS232和RS485的区别

我们常用RS232和RS485这两种串行通信接口标准,它们各自具有不同的特点和适用场景。

通信接口电平信号传输距离受干扰传输单位
RS232“1”为-3V至-15V,“0”为+3V至+15V一般10米以内容易一主一从
RS485

“1”以两线间的电压差+2V至+6V表示

“0”以两线间的电压差-6V至-2V表示

最多可达3000米不易一主多从

通过上面的表格可以看出两种通信接口的不同,单片机上的UART/USART口都是TTL电平信号,想要通过RS485或者RS232传输数据,需要在它们之间电平转换芯片,我们一般用RS232作打印日常的调试信息,RS485在工业上面用的比较多,因为比较稳定不易受干扰。

2.TTL电平

TTL全称为Transistor-Transistor Logic,即晶体管-晶体管逻辑电平。逻辑“1”通常对应的电压范围在2.4V到5V之间,而逻辑“0”对应的电压范围在0V到0.8V之间。我们一般会用到USB TO TTL这种小模块,来连接单片机的UART口来打印调试信息。

二、串口通讯协议

1.连接方式

典型的UART/USART通信使用3根线完成,分别是发送线(TX)、接收线(RX)和地线(GND)。在通信时,必须将双方的TX和RX交叉连接,并将GND相连才可正常通信。

2.协议构成

(1)起始位(Start Bit):

起始位始终是一个逻辑0(低电平),它标志着数据开始传输。对于接收方,当检测到从高到低的跳变时,就知道新的数据字符即将开始。

(2)数据位(Data Bits):

数据位是实际要传输的信息。STM32 UART支持5至9位的数据位,但最常用的配置是8位数据位。数据位是从最低位(LSB)到最高位(MSB)依次传输的

(3)校验位(Parity Bit):

  • 校验位是可选的,用于增加数据传输的可靠性。STM32 UART支持奇校验、偶校验和无校验模式。
    • 奇校验:数据中1的个数加上校验位中1的个数应为奇数。
    • 偶校验:数据中1的个数加上校验位中1的个数应为偶数。
    • 无校验:没有校验位。

(4)停止位(Stop Bit):

停止位标志着数据字符的结束。STM32 UART支持1位、1.5位或2位的停止位。停止位始终是高电平。停止位的作用是允许接收器有足够的时间来处理数据,并准备接收下一个字符。

(5)波特率(Baud Rate):

波特率定义了每秒传输的位数。例如,9600波特意味着每秒传输9600个位。STM32 UART可以配置为支持广泛的波特率范围。

3.工作原理

在闲置状态下,UART的引脚一直被拉高,引脚如果被拉低,它标志着数据开始传输,然后开始依次传输数据位,一般我们都用8位数据位,然后根据配置发送奇偶校验位,最后拉高电平,停止数据传输,数据传输的速率是根据波特率得出的,如果发送和接收两端使用了不同的波特率,那么得到的就会是一堆乱码

三、应用程序

1.初始化串口

  1. //bound:波特率
  2. void uart_init()
  3. {
  4. //UART 初始化设置
  5. UART1_Handler.Instance=USART1; //USART1
  6. UART1_Handler.Init.BaudRate=115200; //波特率
  7. UART1_Handler.Init.WordLength=UART_WORDLENGTH_8B; //字长为8位数据格式
  8. UART1_Handler.Init.StopBits=UART_STOPBITS_1; //一个停止位
  9. UART1_Handler.Init.Parity=UART_PARITY_NONE; //无奇偶校验位
  10. UART1_Handler.Init.HwFlowCtl=UART_HWCONTROL_NONE; //无硬件流控
  11. UART1_Handler.Init.Mode=UART_MODE_TX_RX; //收发模式
  12. HAL_UART_Init(&UART1_Handler); //HAL_UART_Init()会使能UART1
  13. //HAL_UART_Receive_IT(&UART1_Handler, (u8 *)aRxBuffer, RXBUFFERSIZE);//该函数会开启接收中断:标志位UART_IT_RXNE,并且设置接收缓冲以及接收缓冲接收最大数据量(使用回调函数处理中断需要调用该函数)
  14. }

由上面代码得知,我们配置了USART1,波特率为115200,数据位为8,一个停止位,没有奇偶校验,可以同时收发。

2.使能GPIO口

  1. void HAL_UART_MspInit(UART_HandleTypeDef *huart)
  2. {
  3. //GPIO端口设置
  4. GPIO_InitTypeDef GPIO_Initure;
  5. if(huart->Instance==USART1)//如果是串口1,进行串口1 MSP初始化
  6. {
  7. __HAL_RCC_GPIOA_CLK_ENABLE(); //使能GPIOA时钟
  8. __HAL_RCC_USART1_CLK_ENABLE(); //使能USART1时钟
  9. GPIO_Initure.Pin=GPIO_PIN_9; //PA9
  10. GPIO_Initure.Mode=GPIO_MODE_AF_PP; //复用推挽输出
  11. GPIO_Initure.Pull=GPIO_PULLUP; //上拉
  12. GPIO_Initure.Speed=GPIO_SPEED_FAST; //高速
  13. GPIO_Initure.Alternate=GPIO_AF7_USART1; //复用为USART1
  14. HAL_GPIO_Init(GPIOA,&GPIO_Initure); //初始化PA9
  15. GPIO_Initure.Pin=GPIO_PIN_10; //PA10
  16. HAL_GPIO_Init(GPIOA,&GPIO_Initure); //初始化PA10
  17. __HAL_UART_DISABLE_IT(huart,UART_IT_TC);
  18. #if EN_USART1_RX
  19. __HAL_UART_ENABLE_IT(huart,UART_IT_RXNE); //开启接收中断
  20. HAL_NVIC_EnableIRQ(USART1_IRQn); //使能USART1中断通道
  21. HAL_NVIC_SetPriority(USART1_IRQn,3,3); //抢占优先级3,子优先级3
  22. #endif
  23. }
  24. }

第一段代码调用Hal库的HAL_UART_Init(&UART1_Handler)函数以后,我们需要在HAL_UART_MspInit将对应的TX和RX两个口使能才能使串口正常使用。

3.串口发送数据

HAL_UART_Transmit(&UART1_Handler,(uint8_t*)USART_RX_BUF,len,1000);

用HAL_UART_Transmit这个函数可以通过UART1发出信息,USART_RX_BUF是我们要发出的内容,len是内容数组的大小。

4.串口接收数据

  1. //串口1中断服务程序
  2. void USART1_IRQHandler(void)
  3. {
  4. u8 Res;
  5. #if SYSTEM_SUPPORT_OS //使用OS
  6. OSIntEnter();
  7. #endif
  8. if((__HAL_UART_GET_FLAG(&UART1_Handler,UART_FLAG_RXNE)!=RESET))
  9. {
  10. HAL_UART_Receive(&UART1_Handler,&Res,1,1000);
  11. if(USART_RX_CNT<USART_REC_LEN)
  12. {
  13. USART_RX_BUF[USART_RX_CNT]=Res;
  14. USART_RX_CNT++;
  15. }
  16. }
  17. HAL_UART_IRQHandler(&UART1_Handler);
  18. #if SYSTEM_SUPPORT_OS //使用OS
  19. OSIntExit();
  20. #endif
  21. }
  22. #endif

接收数据是在串口的中断里面进行的,每来8bit数据,都会进入一次串口中断,USART_RX_BUF就是我们接收到数据的内容,USART_RX_CNT就是内容数组的大小,注意本代码并未对其优化,按常理来说,还应当对其加一个定时器,按传输速率计算多长时间没传来下一个数据,就算本次数据传输完成了。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小桥流水78/article/detail/982180
推荐阅读
相关标签
  

闽ICP备14008679号