STM32-RS232串口通信(含代码)

本文介绍了UART通信的基本概念,包括波特率设定、数据格式(起始位、数据位和停止位)以及RS232通信接口在串行通信中的作用。同时提到了TTL电平与RS232电平的差异,以及如何通过MAX232进行电平转换。最后概述了串口数据收发的基本步骤,如配置、初始化和DMA使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、UART通信

      UART是Universal Asynchronous Receiver / Transmitter的缩写,意即通用异步串行通信接口,是最常用的通信技术之一,广泛用于设备与电脑之间、设备与设备之间、设备内部芯片与芯片之间的通信。以两个5V单片机芯片之间的UART串口通信为例,如图1所示:

        波特率就是发送二进制数据位的速率,习惯上用baud表示,即发送一位二进制数据的持续时间=1/baud。在通信之前,单片机1和单片机2首先都要明确的约定好它们之间的通信波特率,必须保持一致,收发双方才能正常实现通信。

        约定好速度后,还要考虑第二个问题,数据什么时候是起始,什么时候是结束呢?在UART通信的时候,一个字节是8位,规定当没有通信信号发生时,通信线路保持高电平,当要发送数据之前,先发一位0表示起始位,然后发送8位数据位,数据位是先低后高的顺序,数据位发完后再发一位1表示停止位。这样本来要发送一个字节的8位数据,而实际上一共发送了10位,多出来的两位其中一位起始位,一位停止位。而接收方呢,原本一直保持的高电平,一旦检测到了一位低电平,那就知道了要开始准备接收数据了,接收到8位数据位后,检测到停止位,再准备下一个数据的接收,如图2所示。

串口通信的接收过程

(异步通信:接收器和发送器有各自的时钟;同步通信:发送器和接收器由同一个时钟源控制。RS232是异步通信)

(1)开始通信时,信号线为空闲(逻辑1),当检测到由1到0的跳变时,开始对“接收时钟”计数。

(2)当计到8个时钟时,对输入信号进行检测,若仍为低电平,则确认这是“起始位”,而不是干扰信号。

(3)接收端检测到起始位后,隔16个接收时钟,对输入信号检测一次,把对应的值作为D0位数据。若为逻辑1, 作为数据位1;若为逻辑0,作为数据位0。

(4)再隔16个接收时钟,对输入信号检测一次,把对应的值作为D1位数据。….,直到全部数据位都输入。

(5)检测校验位P(如果有的话)。

(6)接收到规定的数据位个数和校验位后,通信接口电路希望收到停止位S(逻辑1),若此时未收到逻辑1,说明出现了错误,在状态寄存器中置“帧错误”标志。若没有错误,对全部数据位进行奇偶校验,无校验错时,把数据位从移位寄存器中送数据输入寄存器。若校验错,在状态寄存器中置奇偶错标志。

(7)本幀信息全部接收完,把线路上出现的高电平作为空闲位。

(8)当信号再次变为低时,开始进入下一幀的检测。

二、RS232通信接口

        TTL电平用于串口通信时,有3.3V和5V两个系列。由于电压范围小,所以抗干扰能力较弱,传输的具体不远,在9600波特率传输距离为2米,一般不超过15米。因为RS232电平是负逻辑,且电平值可以高达12V,最大传输距离可以达到十几米,而通常单片机引脚是兼容的TTL电平标准,那么RS232接口想要与单片机相连接,就需要用一个电平转换芯片(比如MAX232)来完成。

        在关于串口通讯的叫法太多,什么RS232通讯、串口通讯、DB9通讯、UART通讯等等,随便怎么叫吧,理解就行。

        串行通讯,从字面意思理解就行,就是把数据串成一串发出去,比如一个字节8位,高位先发出去,那么发送顺序就是bit7--bit6--bit5--bit4--bit3--bit2--bit1--bit0。

串口数据收发:

        1、声明一个UART_HandleTypeDef结构

        2、配置波特率、字符长度、停止位、校验位等

        3、UART 管脚配置:配置管脚位置和时钟

        4、UART初始化

        5、开始发送数据

DMA配置

中断收发

### STM32 RS232 串口通信出现 `FF` 的解决方案 当STM32通过RS232进行串口通信时遇到连续传输字符 `FF` (即十六进制的255)的情况,这通常意味着接收端接收到的是错误的数据或者根本就没有接收到预期的数据。这种现象可能由多种因素引起。 #### 可能原因分析 1. **电平不匹配** 如果发送方和接收方之间的电平标准不同,则可能导致数据无法正确解析。例如,在TTL电平下,高电平为+3.3V或+5V表示逻辑1;而在RS232中,-3V至-15V表示逻辑1,+3V至+15V表示逻辑0[^1]。如果两者之间没有合适的转换电路(如MAX232芯片),则可能会导致误码率增加甚至完全失效。 2. **波特率设置不当** 波特率是指每秒钟可以传输多少位二进制信息。对于双方而言,必须保持一致才能实现有效的通讯。任何一方配置失误都会造成帧同步失败从而产生乱码等问题。因此需要确认两端设备所使用的波特率是否相同,并且该速率应在合理范围内以确保稳定工作[^4]。 3. **硬件连接问题** 检查连线是否有松动、短路等情况发生。特别是GND接地不良容易引发此类故障。另外还需注意一些特殊情况下某些管脚定义差异也可能影响正常使用效果。比如PC机上COM口与开发板间可能存在针脚对应关系的不同步情况[^2]。 4. **初始化配置错误** 在编写程序过程中如果没有按照手册要求完成相应寄存器设定的话也有可能会出现异常状况。具体到本案例里可能是UART模块未被恰当激活或者是停止位/校验位等参数选择不合适所致[^3]。 #### 解决建议 针对上述可能性提供如下改进建议: - 使用专用的电平转换器件来适配不同的接口类型; - 确认并调整好所有涉及节点间的波特率一致性; - 对整个线路进行全面细致地排查修复潜在接触隐患; - 认真阅读官方文档对照着检查一遍代码中的各项初始状态赋值语句。 ```c // 初始化 UART 接口函数示例 void USART_Config(void){ // 配置GPIO... huart1.Instance = USART1; huart1.Init.BaudRate = 9600; /* 设置波特率为9600 */ huart1.Init.WordLength = UART_WORDLENGTH_8B;/* 字符长度设为8bit*/ huart1.Init.StopBits = UART_STOPBITS_1; /* 停止位数量选1个*/ huart1.Init.Parity = UART_PARITY_NONE; /* 不启用奇偶检验*/ huart1.Init.Mode = UART_MODE_TX_RX; /* 开启收发模式*/ huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; /* 关闭硬件流控*/ huart1.Init.OverSampling = UART_OVERSAMPLING_16; HAL_UART_Init(&huart1); } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值