欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

STM32使用串口实现USART1发送字符串

程序员文章站 2024-02-22 11:58:46
...

STM32F407ZE 使用串口编程,实现函数能够通过USART1发送字符串,串口助手接收字符串

运行结果:
STM32使用串口实现USART1发送字符串

其中问题:
①字符串换行问题:
Linux : ‘\n’
windows: ‘\r’ ‘\n’
安卓: ‘\r’ ‘\n’
因此在这个例子中,发送字符串时应在字符串后面加入\r\n,(“Hello world!\r\n”)

②串口助手接收到的字符串缺少首字符问题:
STM32使用串口实现USART1发送字符串
如下代码,加入第四行,意为发送字符前将标志位清空,因为一开始DataString就有一个’\0’,循环时就会跳过第一个字符

void USART_SendString(USART_TypeDef* USARTx, char *DataString)
{
	int i = 0;
	USART_ClearFlag(USARTx,USART_FLAG_TC);										//发送字符前清空标志位(否则缺失字符串的第一个字符)
	while(DataString[i] != '\0')												//字符串结束符
	{
		USART_SendData(USARTx,DataString[i]);									//每次发送字符串的一个字符
		while(USART_GetFlagStatus(USARTx,USART_FLAG_TC) == 0);					//等待数据发送成功
		USART_ClearFlag(USARTx,USART_FLAG_TC);									//发送字符后清空标志位
		i++;
	}
}

具体代码如下:

main.c部分

#include <stm32f4xx.h>
#include "ustart.h"

int main()
{
	USART1_Init();
	for(int i = 0; i < 10; i ++)													//发送十遍
		USART_SendString(USART1, "Hello world!\r\n");
}

ustart.h部分

c
#ifndef USTART_H
#define USTART_H

#include <stm32f4xx.h>
#include <stm32f4xx_usart.h>
#include "sys.h"
#include "delay.h"

void USART1_Init();
void USART_SendString(USART_TypeDef* USARTx, char *DataString);
#endif

ustart.c部分

#include "ustart.h"
#include <string.h>

void USART1_Init()
{
	GPIO_InitTypeDef 	GPIOInit_Struct;
	USART_InitTypeDef 	USARTInit_Struct;
	
	//1、使能时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
	
	//2、初始化对应的IO引脚复用为USART1功能
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
	
	GPIOInit_Struct.GPIO_Pin 	= GPIO_Pin_9 | GPIO_Pin_10;
	GPIOInit_Struct.GPIO_Mode	= GPIO_Mode_AF;
	GPIOInit_Struct.GPIO_OType	= GPIO_OType_PP;
	GPIOInit_Struct.GPIO_Speed 	= GPIO_Fast_Speed;
	GPIOInit_Struct.GPIO_PuPd	= GPIO_PuPd_UP;
	GPIO_Init(GPIOA,&GPIOInit_Struct);
	
	//将PA9  PA10复用为USART1功能
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);
	
	//3、USART1初始化
	USARTInit_Struct.USART_BaudRate 	= 115200; 								//波特率
	USARTInit_Struct.USART_Parity		= USART_Parity_No;						//无校验位
	USARTInit_Struct.USART_StopBits		= USART_StopBits_1;						//1位停止位
	USARTInit_Struct.USART_WordLength	= USART_WordLength_8b;					//8位数据位
	USARTInit_Struct.USART_Mode			= USART_Mode_Rx | USART_Mode_Tx;		//收发模式
	USARTInit_Struct.USART_HardwareFlowControl	= USART_HardwareFlowControl_None;//无硬件控制流
	USART_Init(USART1,&USARTInit_Struct);
	
	//4、开启串口
	USART_Cmd(USART1,ENABLE);
}

void USART_SendString(USART_TypeDef* USARTx, char *DataString)
{
	int i = 0;
	USART_ClearFlag(USARTx,USART_FLAG_TC);										//发送字符前清空标志位(否则缺失字符串的第一个字符)
	while(DataString[i] != '\0')												//字符串结束符
	{
		USART_SendData(USARTx,DataString[i]);									//每次发送字符串的一个字符
		while(USART_GetFlagStatus(USARTx,USART_FLAG_TC) == 0);					//等待数据发送成功
		USART_ClearFlag(USARTx,USART_FLAG_TC);									//发送字符后清空标志位
		i++;
	}
}