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

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

运行结果:
在这里插入图片描述

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

②串口助手接收到的字符串缺少首字符问题:
在这里插入图片描述
如下代码,加入第四行,意为发送字符前将标志位清空,因为一开始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++;
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_43793181/article/details/109129381