9-3串口发送&串口发送+接收

常用函数

1
void USART_DeInit(USART_TypeDef* USARTx);

USART恢复缺省配置

1
void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct);

USART初始化结构体

1
void USART_StructInit(USART_InitTypeDef* USART_InitStruct);

USART结构体初始化

12
void USART_ClockInit(USART_TypeDef* USARTx, USART_ClockInitTypeDef* USART_ClockInitStruct);void USART_ClockStructInit(USART_ClockInitTypeDef* USART_ClockInitStruct);

配置同步时钟输出,时钟是否输出、时钟的极性、相位等参数,使用结构体配置。

1
void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState);

USART开启指令

1
void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState);

USART中断配置

1
void USART_DMACmd(USART_TypeDef* USARTx, uint16_t USART_DMAReq, FunctionalState NewState);

开启USART到DMA的触发通道

1
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);

发送数据,写DR寄存器

1
uint16_t USART_ReceiveData(USART_TypeDef* USARTx);

接收数据,读DR寄存器

串口发送

Serial.c

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
#include "stm32f10x.h"                  // Device header#include <stdio.h>#include <stdarg.h> void Serial_Init(void){	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//开启USART1的时钟	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//开启GPIOA的时钟 	GPIO_InitTypeDef GPIO_InitStructure;	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//引脚模式,TX是USART外设控制的输出脚,选择复用推挽输出;RX引脚是USART外设控制的输入脚,选择输入模式,一般RX配置为浮空输入或者上拉输入。	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;//PA9是USART1的TX复用端口	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	GPIO_Init(GPIOA, &GPIO_InitStructure); 	USART_InitTypeDef USART_InitStructure;	USART_InitStructure.USART_BaudRate = 9600;//波特率	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//硬件流控制	USART_InitStructure.USART_Mode = USART_Mode_Tx;//发送模式	USART_InitStructure.USART_Parity = USART_Parity_No;//校验位,选择不需要校验	USART_InitStructure.USART_StopBits = USART_StopBits_1;//停止位	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长,由于前面没有选择校验,这里选8位	USART_Init(USART1,&USART_InitStructure); 	USART_Cmd(USART1,ENABLE);//USART使能} void Serial_SendByte(uint8_t Byte){	USART_SendData(USART1, Byte);//USART发送数据	while( USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET );//获取标志位,发送寄存器空标志位,避免产生数据覆盖的问题} void Serial_SendArray(uint8_t *Array, uint16_t Length)//USART发送数组{	uint16_t i;	for (i=0;i<Length;i++)	{		Serial_SendByte(Array[i]);	}} void Serial_SendString(char *String)//USART发送字符串{	uint8_t i;	for ( i = 0; String[i] != '\0'; i++ )	{		Serial_SendByte(String[i]);	}} 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)//USART发送数字{	uint8_t i;	for ( i = 0; i<Length; i++ )	{		Serial_SendByte(Number / Serial_Pow(10,Length - i - 1) % 10 + '0');	}} int fputc(int ch, FILE *f)//printf 输出到串口{	Serial_SendByte(ch);	return ch;} 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);} 

main.c

1234567891011121314151617181920212223242526
#include "stm32f10x.h"                  // Device header#include "Delay.h"#include "OLED.h"#include "Serial.h" int main(void){	OLED_Init();	Serial_Init(); //	Serial_SendByte('A'); //	uint8_t MyArray[] = {0x41,0x42,0x43,0x44};//	Serial_SendArray(MyArray, 4); //	Serial_SendString("Hello World!");//	Serial_SendNumber(12345, 5);//	printf("Num = %d\r\n",666); //	char String[100];//	sprintf(String,"Num = %d\r\n",666);//	Serial_SendString(String); 	Serial_Printf("Num = %d\r\n",666);} 

串口发送+接收

Serial.c

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
#include "stm32f10x.h"                  // Device header#include <stdio.h>#include <stdarg.h> uint8_t Serial_RxData;uint8_t Serial_RxFlag;   void Serial_Init(void){	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//开启USART1的时钟	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//开启GPIOA的时钟 	GPIO_InitTypeDef GPIO_InitStructure;	//配置PA9为TX引脚	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//引脚模式,TX是USART外设控制的输出脚,选择复用推挽输出;RX引脚是USART外设控制的输入脚,选择输入模式,一般RX配置为浮空输入或者上拉输入。	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	GPIO_Init(GPIOA, &GPIO_InitStructure);	//配置PA10为RX引脚	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//RX配置为浮空输入	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	GPIO_Init(GPIOA, &GPIO_InitStructure); 	USART_InitTypeDef USART_InitStructure;	USART_InitStructure.USART_BaudRate = 9600;//波特率	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//硬件流控制	USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;//USART的RX和TX模式打开	USART_InitStructure.USART_Parity = USART_Parity_No;//校验位,选择不需要校验	USART_InitStructure.USART_StopBits = USART_StopBits_1;//停止位	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长,由于前面没有选择校验,这里选8位	USART_Init(USART1,&USART_InitStructure); 	USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//开启RXNE标志位到NVIC的输出	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 	NVIC_InitTypeDef NVIC_InitStructure;	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;	NVIC_Init(&NVIC_InitStructure); 	USART_Cmd(USART1,ENABLE);} void Serial_SendByte(uint8_t Byte){	USART_SendData(USART1, Byte);	while( USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET );//获取标志位,发送寄存器空标志位,避免产生数据覆盖的问题 } void Serial_SendArray(uint8_t *Array, uint16_t Length){	uint16_t i;	for (i=0;i<Length;i++)	{		Serial_SendByte(Array[i]);	}} void Serial_SendString(char *String){	uint8_t i;	for ( i = 0; String[i] != '\0'; i++ )	{		Serial_SendByte(String[i]);	}} 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 + '0');	}} int fputc(int ch, FILE *f)//printf 输出到串口{	Serial_SendByte(ch);	return ch;} 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);} uint8_t Serial_GetRxFlag(void){	if(Serial_RxFlag == 1)	{		Serial_RxFlag = 0;		return 1;	}	return 0;} uint8_t Serial_GetRxData(void){	return Serial_RxData;} void USART1_IRQHandler(void){	if(USART_GetFlagStatus(USART1,USART_IT_RXNE) == SET)	{		Serial_RxData = USART_ReceiveData(USART1);		Serial_RxFlag = 1;		USART_ClearITPendingBit(USART1,USART_IT_RXNE);	}} 

main.c

12345678910111213141516171819202122
#include "stm32f10x.h"                  // Device header#include "Delay.h"#include "OLED.h"#include "Serial.h"uint8_t RxData;int main(void){	OLED_Init();	OLED_ShowString(1,1,"RxData:");	Serial_Init();	while (1)	{		if(Serial_GetRxFlag() == 1)		{			RxData = Serial_GetRxData();			Serial_SendByte(RxData);			OLED_ShowHexNum(1,8,RxData,2); 		}	}} 
🔍 ×