资讯动态

STM32 (6)串口通信USART 发送和接收

发布时间:2026/9/2 13:17:45 来源:尧图企业网站定制
文章目录通信接口USART基本结构串口发送串口接收通信接口全双工有两个通道发送接受可以同时进行半双工只有一个通道不能同时进行USAERTX数据发送脚RX接收脚I2CSCL时钟SDA数据SPISCLK时钟MOSI主机输出数据脚发送MISO输入接收CS片选用于指定通信对象CAN用两个引脚表示差分数组USB同上前三个都要共地差分抗干扰强速度快距离远USART基本结构1.开启USART和GPIO的时钟2.GPIO初始化TX配置成复用输出RX输入3.配置USART初始化USART_Init()4.开启USART只需要发送功能如果还需要接收功能就要配置中断ITConfig和NVICUSART_Cmd()函数USART_SendData()发送数据写DR寄存器USART_ReceiveData()接收数据读DR寄存器串口发送代码#includestm32f10x.h// Device header#includestdio.h//单片机没有屏幕需要进行重定向voidSerial_Init(void){RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_ModeGPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_PinGPIO_Pin_9;GPIO_InitStructure.GPIO_SpeedGPIO_Speed_50MHz;GPIO_Init(GPIOA,GPIO_InitStructure);USART_InitTypeDef USART_InitStructure;USART_InitStructure.USART_BaudRate9600;USART_InitStructure.USART_HardwareFlowControlUSART_HardwareFlowControl_None;USART_InitStructure.USART_ModeUSART_Mode_Tx;USART_InitStructure.USART_ParityUSART_Parity_No;USART_InitStructure.USART_StopBitsUSART_StopBits_1;USART_InitStructure.USART_WordLengthUSART_WordLength_8b;USART_Init(USART1,USART_InitStructure);USART_Cmd(USART1,ENABLE);}voidSerial_SendByte(uint8_tByte)//发送函数{USART_SendData(USART1,Byte);while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)RESET);//下一次在生成标志位自动清零}voidSerial_SendArray(uint8_t*Array,uint16_tLength)//发送数组{uint16_ti;for(i0;iLength;i){Serial_SendByte(Array[i]);}}voidSerial_SendString(char*String)//发送字符串{uint8_ti;for(i0;String[i]!0;i){Serial_SendByte(String[i]);}}uint32_tSerial_Pow(uint32_tx,uint32_ty){uint32_tResult1;while(y--){Result*x;}returnResult;}voidSerial_SendNum(uint32_tNumber,uint32_tLength)//输出数字函数因为直接Serial_SendByte123这里的123会被ascii表识别成其他值{uint8_ti;for(i0;iLength;i){Serial_SendByte(Number/Serial_Pow(10,Length-i-1)%100x30);}}intfputc(intch,FILE*f){Serial_SendByte(ch);returnch;}主函数代码#includestm32f10x.h// Device header#includeDelay.h#includeOLED.h#includeSerial.hintmain(void){OLED_Init();Serial_Init();// Serial_SendByte(0x41);// uint8_t MyArray[]{0x41,0x42,0x43,0x44};// Serial_SendArray(MyArray,4);// Serial_SendString(xswl);// Serial_SendNum(12345,5);// printf(Num%d\r\n,666);charString[100];sprintf(String,Num%d\r\n,666);//后面的参数可以变Serial_SendString(String);while(1){}}串口接收uint8_tSerial_GetRxFlag(void){if(Serial_RxFlag1){Serial_RxFlag0;return1;}return0;}uint8_tSerial_GetRxData(void){returnSerial_RxData;}//上面两个函数只是为了获取标志位和数据的voidUSART1_IRQHandler(void)//启动文件{if(USART_GetITStatus(USART1,USART_IT_RXNE)SET){Serial_RxDataUSART_ReceiveData(USART1);Serial_RxFlag1;USART_ClearITPendingBit(USART1,USART_IT_RXNE);}}

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价