主函数代码部分:
#include "stm32f10x.h" // Device header #include "Delay.h" #include "OLED.h" #include "Serial.h" #include "LED.h" #include "string.h" int main(void) { OLED_Init(); Serial_Init(); OLED_ShowString(1,1,"TxPacket"); OLED_ShowString(3,1,"RxPacket"); while (1) { if(Serial_RxFlag==1) { OLED_ShowString(4, 1, " "); OLED_ShowString(4, 1, Serial_RxPacket); if(strcmp(Serial_RxPacket,"LED_ON")==0) { LED1_ON(); Serial_SendString("LED_ON_OK\r\n"); OLED_ShowString(2,1," "); OLED_ShowString(2,1,"LED_ON_OK"); } else if(strcmp(Serial_RxPacket,"LED_OFF")==0) { LED1_ON(); Serial_SendString("LED_OFF_OK\r\n"); OLED_ShowString(2,1," "); OLED_ShowString(2,1,"LED_OFF_OK"); } else { Serial_SendString("ERROR\r\n"); OLED_ShowString(2,1," "); OLED_ShowString(2,1,"ERROR"); } Serial_RxFlag = 0; } } }
Serual代码函数:
#include "stm32f10x.h" // Device header #include <stdio.h> #include <stdarg.h> uint8_t Serial_RxFlag; uint8_t Serial_RxPacket[100];//接收库函数USART_Serial_ReceiveData(USART1)的值, void Serial_Init(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); RCC_APB1PeriphClockCmd(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); GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU; GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10; GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStruct); 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=1; USART_InitStruct.USART_WordLength=0; USART_Init(USART1,&USART_InitStruct); USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); NVIC_InitTypeDef NVIC_InitStruct; NVIC_InitStruct.NVIC_IRQChannel=USART1_IRQn; NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1; NVIC_InitStruct.NVIC_IRQChannelSubPriority=1; NVIC_Init(&NVIC_InitStruct); 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 Lenth) { uint8_t i; for(i=0;i<Lenth;i++) { USART_SendData(USART1,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(uint16_t x,uint16_t y) { uint32_t Return; while(y--) { Return*=x; } return Return; } void Serial_SendNumber(uint32_t Number,uint8_t Lenth) { uint8_t i; for(i=0;i<Number;i++) { USART_SendData(USART1,Number/Serial_Pow(10,Lenth-1-i)%10+0x40); } } //接收数据 void USART1_IRQHandler(void) { static uint8_t RxState=0;//分情况判断 static uint8_t pRxPacket=0;//数组下标判断 if(USART_GetITStatus(USART1,USART_IT_RXNE)==SET) { uint8_t RxData=USART_ReceiveData(USART1); if(RxState==0) { if(RxData=='@'&&Serial_RxFlag==0) { RxState=1; pRxPacket=0; } } else if(RxState==1) { if(RxData=='\r') RxState=2; else { Serial_RxPacket[pRxPacket]=RxData; pRxPacket++; } } else if(RxState==2) { if(RxData=='\n') { RxState=0; Serial_RxPacket[pRxPacket]='\0'; Serial_RxFlag=1;//置标志位,告诉已结束 } } USART_ClearITPendingBit(USART1,USART_IT_RXNE); } }
Serial.h代码部分:
#ifndef __SERIAL_H #define __SERIAL_H #include <stdio.h> extern uint8_t Serial_RxFlag; extern char Serial_RxPacket[]; void Serial_Init(void); void Serial_SendByte(uint8_t Byte); void Serial_SendArray(uint8_t *Array,uint16_t Lenth); void Serial_SendString(char* String); uint32_t Serial_Pow(uint16_t x,uint16_t y); void Serial_SendNumber(uint32_t Number,uint8_t Lenth); #endif