STM32使用串列埠實現USART1傳送字串

佳佳鴿發表於2020-10-17

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++;
	}
}

相關文章