串口通信原理及应用

本文详细介绍了串口通信在STM32中的应用,包括连接方式、数据帧结构(包括起始位、数据位、校验位和停止位),并提供了代码示例,展示了如何配置USART1接口以进行双向或单向通信,以及波特率设置等关键步骤。

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

1. 前言介绍

串口通信是一种设备间非常常用的串行接口,以比特位的形式发送或接收数据,由于成本很低,容易使用,工程师经常使用这种方式来调试 MCU。

串口通信应用广泛,可以实现两个设备之间的通信,例如STM32与wifi、蓝牙、4G、NB-IoT使用的都是串口通信协议。

2. 连接方式

如下图所示:
己方的RX(接收引脚)对应对方的 TX(发送引脚),而己方的 TX 则是接收对方的 RX 引脚,这种方法可以用于双向通信。

在这里插入图片描述

如若只需进行单向通信,采用以下方式也是可以的,此方法通常为仅接收外部设备传来的数据:
在这里插入图片描述

3. 数据帧格式

起始位(Start Bit):数据帧的起始位,用于标识数据传输的开始。通常为逻辑低电平。

数据位(Data Bits):数据帧中实际传输的数据位数。常见的数据位数有5位、6位、7位和8位。

校验位(Parity Bit):用于校验数据位的奇偶性,以检测和纠正传输中的错误。常见的奇偶校验方式有奇校验和偶校验,也可以选择不使用校验位。

停止位(Stop Bit):数据帧的结束位,用于标识数据传输的结束。通常为逻辑高电平。
在这里插入图片描述

如图所示,可以看到串口数据是低有效位优先传输(LSB)。

4. 代码编写

通过STM32F407的数据手册可以查询到,PA9和PA10引脚是具有 USART1功能的,它被挂载在 APB2 总线上:
在这里插入图片描述
所以我们需要 开启 GPIOA端口时钟以及启用 串口1时钟:

	//开启硬件时钟:GPIO端口硬件时钟、USART硬件时钟
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);

PA9 和 PA10 是作为复用功能使用的,所以还要开启复用功能:

	//配置GPIO引脚为复用功能模式
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10;	//指定9、10号引脚
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//配置为复用功能模式
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//速度越高,功耗就越高,但是响应速度也更快
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//不需要使能内部上下拉电阻
	GPIO_Init(GPIOA, &GPIO_InitStructure);	

然后依次对串口参数进行配置:

	//将对应的GPIO引脚连接到串口
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);
	
	
	//配置串口相关的参数:串口号,波特率,数据位,停止位,流控制
    //波特率
	USART_InitStructure.USART_BaudRate = baud;
	//接收长度
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	//停止位
	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);

以下是完整的配置函数:

void usart1_init(uint32_t baud)
{
	
	//开启硬件时钟:GPIO端口硬件时钟、USART硬件时钟
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
	
	
	//配置GPIO引脚为复用功能模式
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10;	//指定9、10号引脚
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//配置为复用功能模式
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//速度越高,功耗就越高,但是响应速度也更快
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//不需要使能内部上下拉电阻
	GPIO_Init(GPIOA, &GPIO_InitStructure);	
	
	
	
	//将对应的GPIO引脚连接到串口
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);
	
	
	//配置串口相关的参数:串口号,波特率,数据位,停止位,流控制
	USART_InitStructure.USART_BaudRate = baud;
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	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);
	
	
	
	//配置串口相关的中断
	
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
	
	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
	
	
	
	//使能串口工作
	USART_Cmd(USART1, ENABLE);
 
}

以下是其他配置文章
STM32F103ZET6点亮板载LED灯

STM32F103C8T6的三种延时函数

STM32使用PWM(脉冲宽度调制)

书名:《C/C++串口通信典型应用实例编程实践》(电子工业出版社.曹卫杉) PDF扫描版,全书共分10章,共316页。 内容介绍 本书从工程应用的角度出发,对目前流行的三种不同类型的C/C++语言(包括C++ Builder、Visual C++和LabWindows/CVI)开发串口通信(也称为串行通信)程序进行了阐述。 基础篇简单介绍了C/C++语言实现串口通信需要的基本知识;应用篇通过PC与PC、PC与单片机、PC与智能仪器、PC与PLC、PC与GSM短信模块、PC与远程I/O模块等典型应用实例,详细介绍了C/C++语言利用MSComm控件、API函数实现串口通信的程序设计方法。每个实例的设计任务同时采用C++ Builder、Visual C++和Labgrmdows/CVI实现。 本书内容丰富,结构清晰,文字叙述深入浅出,通俗易懂,以实践应用为主,突出程序设计,重在功能实现,有较强的实用性和可操作性。 本书可作为高等院校计算机应用、测控技术、机电一体化、自动化等专业的研究生、本科生以及计算机测控系统研发的工程技术人员等学习C/C++串口通信编程技术的参考书。 目录 基础篇   第1章 串口通信基础   1.1 串口通信的基本概念   1.2 串口通信及其标准   1.3 串口通信调试   第2章 C/C++编程语言与串口通信   2.1 串行通信控件MSComm   2.2 API函数   2.3 线程   2.4 LabWindows/CVI串口通信函数 应用篇   第3章 PC与PC串口通信程序设计   3.1 设计说明   3.2 任务实现   第4章 PC与单片机串口通信程序设计   4.1 设计说明   4.2 任务实现   第5章 PC与智能仪器串口通信程序设计   5.1 设计说明   5.2 任务实现   第6章 PC与PLC串口通信程序设计   6.1 设计说明   6.2 任务实现   第7章 PC与GSM短信模块串口通信程序设计   7.1 设计说明   7.2 任务实现   第8章 PC与读卡器串口通信程序设计   8.1 设计说明   8.2 任务实现   第9章 PC与智能仪器构成的DCS程序设计   9.1 设计说明   9.2 任务实现   第10章 PC与远程I/O模块构成的DCS程序设计   参考文献
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IoT_H2

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值