USART基本結(jié)構(gòu)
串口發(fā)送信息
啟動串口一的時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
初始化對應(yīng)串口一的時鐘,引腳,將TX引腳設(shè)置為復(fù)用推挽輸出。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
配置串口一配置寄存器,設(shè)置波特率為9600,關(guān)閉硬件流控,不使用校驗位,數(shù)據(jù)長度為八字節(jié)
USART_InitTypeDef USART_InitStruct;
USART_InitStruct.USART_BaudRate=9600;
USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART_InitStruct.USART_Mode=USART_Mode_Tx;
USART_InitStruct.USART_Parity=USART_Parity_No;
USART_InitStruct.USART_StopBits=USART_StopBits_1;
USART_InitStruct.USART_WordLength=USART_WordLength_8b;
USART_Init(USART1,&USART_InitStruct);
封裝串口發(fā)送字節(jié)函數(shù)
void Serial_SendByte(uint8_t Byte)
{
USART_SendData(USART1,Byte);
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)== RESET);
}
封裝串口發(fā)送字符串函數(shù)
void Serial_SendString(char *String)
{
uint8_t i;
for (i=0;String[i]!='\0';i++)
{
Serial_SendByte(String[i]);
}
}
封裝串口發(fā)送數(shù)組函數(shù)
void Serial_SendArray(uint8_t *Array,uint16_t Length)
{
uint16_t i;
for (i=0;i<Length;i++)
{
Serial_SendByte(Array[i]);
}
}
封裝串口發(fā)送數(shù)字函數(shù)
uint32_t Serial_Pow(uint32_t x, uint32_t y)
{
uint32_t Result = 1;
while(y--)
{
Result *= x;
}
return Result;
}
void Serial_SendNumber(uint32_t Number, uint8_t Length)
{
uint8_t i;
for(i=0; i<Length; i++)
{
Serial_SendByte(Number / Serial_Pow(10,Length-i-1)%10);
}
}
進階一:重定向print輸出到串口中
/*
fputc是print函數(shù)的底層所以,修改底層文件就能將print輸出重定向到串口。
*/
int fputc(int ch, FILE *f)
{
Serial_SendByte(ch);
return ch;
}
進階二:封裝Serial_Sprintf完成串口輸出功能文章來源:http://www.zghlxwxcb.cn/news/detail-819198.html
/*
char String[100];
sprintf(String,"Num=%d\r\n",666)
Serial_SendString(String);
等價于以下這行代碼
printf("Num=%d\r\n",666)
*/
void Serial_Printf(char *format, ...)
{
char String[100];
va_list arg;
va_start(arg,format);
vsprintf(String,format,arg);
va_end(arg);
Serial_SendString(String);
}
注意:
①發(fā)送和接受均不需要手動清除發(fā)送或接收標志位,因為當發(fā)送字節(jié)或者讀取字節(jié)內(nèi)容時,硬件會自動清0
②Serial_Printf(“串口輸出也支持中文輸出”);
當編碼格式為 UTF-8時才需要配置參數(shù) --no-multibyte-chars
當編碼格式為GB2312時則不需要配置參數(shù)文章來源地址http://www.zghlxwxcb.cn/news/detail-819198.html
到了這里,關(guān)于STM32標準庫開發(fā)——串口發(fā)送/單字節(jié)接收的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!