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++;
}
}
相關文章
- STM32使用DMA傳送串列埠資料串列埠
- 初步使用Ardunio IDE實現STM32的串列埠通訊IDE串列埠
- 【STM32】串列埠串列埠
- STM32傳送串列埠資料丟失位元組的解決辦法串列埠
- QT串列埠助手(四):資料傳送QT串列埠
- 測試stm32串列埠傳送資料在不同條件下的效率串列埠
- QT實現串列埠助手中串列埠名的實時更新QT串列埠
- stm32筆記[16]-使用usb-cdc串列埠.md筆記串列埠
- stm32配合xshell串列埠輸入串列埠
- STM32串列埠通訊串列埠
- ros中使用serial包實現串列埠通訊ROS串列埠
- UART串列埠及Linux實現串列埠Linux
- STM32 串列埠列印 NaN的原因分析!!!串列埠NaN
- STM32 HAL庫之串列埠詳細篇串列埠
- Arduino下的STM32的串列埠通訊UI串列埠
- QT實現簡易串列埠助手QT串列埠
- STM32串列埠列印的那些知識串列埠
- STM32串列埠DMA接收雙緩衝串列埠
- 沒有真實串列埠裝置時使用"虛擬串列埠驅動"除錯你的串列埠程式碼串列埠除錯
- 使用多執行緒實現郵件傳送執行緒
- 串列埠通訊利器:SerialPortStream庫詳解,輕鬆實現C#串列埠開發串列埠C#
- python實現傳送郵件Python
- SpringBoot 實現傳送簡訊Spring Boot
- STM32應用DMA——串列埠收發不定長資料串列埠
- 在Java中,使用HttpUtils實現傳送HTTP請求JavaHTTP
- ton jetton 傳送字串的方式字串
- Python向IP地址傳送字串Python字串
- C#實現掃碼槍串列埠通訊C#串列埠
- 打工筆記--------------------------c#實現串列埠通訊筆記C#串列埠
- nodeMCU wifi透傳到串列埠 支援hexWiFi串列埠
- 公眾號傳送模板資訊java實現(主動傳送)Java
- iOS12系統應用傳送普通郵實現傳送iOS
- 簡訊傳送機的實現
- oracle 傳送郵件 實現方法Oracle
- python實現郵件的傳送Python
- Java實現RS485串列埠通訊Java串列埠
- python使用opencv播放視訊併傳送到串列埠,讓51顯示PythonOpenCV串列埠
- SprinBoot~實現使用非同步任務優化郵件傳送boot非同步優化