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++;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
具體代碼如下:

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");
}
1
2
3
4
5
6
7
8
9
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
1
2
3
4
5
6
7
8
9
10
11
12
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++;
}
}
————————————————
版權聲明:本文為CSDN博主「佳佳鴿」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_43793181/article/details/109129381


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM