STM32标准库开发——串口发送/单字节接收

USART基本结构

串口发送信息

启动串口一的时钟

c 复制代码
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);

初始化对应串口一的时钟,引脚,将TX引脚设置为复用推挽输出。

c 复制代码
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);

配置串口一配置寄存器,设置波特率为9600,关闭硬件流控,不使用校验位,数据长度为八字节

c 复制代码
USART_InitTypeDef  USART_InitStruct;
USART_InitStruct.USART_BaudRate=9600;
USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART_InitStruct.USART_Mode=USART_Mode_Tx;
USART_InitStruct.USART_Parity=USART_Parity_No;
USART_InitStruct.USART_StopBits=USART_StopBits_1;
USART_InitStruct.USART_WordLength=USART_WordLength_8b;
USART_Init(USART1,&USART_InitStruct);

封装串口发送字节函数

c 复制代码
void Serial_SendByte(uint8_t Byte)
{
	USART_SendData(USART1,Byte);
	while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)== RESET);	
}

封装串口发送字符串函数

c 复制代码
void Serial_SendString(char *String)
{
	uint8_t i;
	for (i=0;String[i]!='\0';i++)
	{
		Serial_SendByte(String[i]);
	}
}

封装串口发送数组函数

c 复制代码
void Serial_SendArray(uint8_t *Array,uint16_t Length)
{
	uint16_t i;
	for (i=0;i<Length;i++)
	{
		Serial_SendByte(Array[i]);
	}
}

封装串口发送数字函数

c 复制代码
uint32_t Serial_Pow(uint32_t x, uint32_t y)
{
	uint32_t Result = 1;
	while(y--)
	{
		Result *= x;
	}
	return Result;
}
void Serial_SendNumber(uint32_t Number, uint8_t Length)
{
	uint8_t i;
	for(i=0; i<Length; i++)
	{
		Serial_SendByte(Number / Serial_Pow(10,Length-i-1)%10);
	}
}

进阶一:重定向print输出到串口中

c 复制代码
/*
 fputc是print函数的底层所以,修改底层文件就能将print输出重定向到串口。
*/
int fputc(int ch, FILE  *f)
{
	Serial_SendByte(ch);
	return ch;
}

进阶二:封装Serial_Sprintf完成串口输出功能

c 复制代码
/*
char String[100];
sprintf(String,"Num=%d\r\n",666)
Serial_SendString(String);
等价于以下这行代码
printf("Num=%d\r\n",666)
*/
void Serial_Printf(char *format, ...)
{
	char String[100];
	va_list arg;
	va_start(arg,format);
	vsprintf(String,format,arg);
	va_end(arg);
	Serial_SendString(String);
}

注意:

①发送和接受均不需要手动清除发送或接收标志位,因为当发送字节或者读取字节内容时,硬件会自动清0

②Serial_Printf("串口输出也支持中文输出");

当编码格式为 UTF-8时才需要配置参数 --no-multibyte-chars

当编码格式为GB2312时则不需要配置参数

相关推荐
Lumos6fly6 小时前
《嵌入式通讯协议栈实战》 5 AT24C02与OLED
stm32·单片机
天吾cc8 小时前
RTT-IO设备模型
单片机·嵌入式硬件·学习
wengqidaifeng12 小时前
2026 年电赛(TI 杯)H 题:MaxiCamPro、双主控通信、VOFA+ 遥测与可复现实验方法
c语言·单片机·嵌入式硬件
寻道模式12 小时前
【运维心得】电视KK.RV22.E32B“捉鬼”实录:从炸机到 eMMC 的千里追击(1)
单片机·嵌入式硬件·mos管·开关电源
科芯创展14 小时前
XZ6206,6.5V,300mA稳压LDO芯片
单片机
科芯创展15 小时前
XC6206,8V,250mA稳压LDO芯片
嵌入式硬件
平凡的小蚂蚁15 小时前
Exynos4412-POP-7inLCD裸机开发完整教程(STM32 库风格)
驱动开发·stm32·单片机·嵌入式硬件·嵌入式·硬件工程
破晓单片机15 小时前
096、STM32项目分享开源:蓝牙智能手环
stm32·单片机·嵌入式硬件·开源
天吾cc15 小时前
RTT-Pin设备模型
单片机·嵌入式硬件
半仙100816 小时前
电感式编码器 IS06-18 在轮毂电机中的实战应用指南
嵌入式硬件·机器人