发送文本数据实物图:
发送文本数据控制LED点亮:
发送文本数据控制LED熄灭:
发送文本数据错误时:
代码部分如下:
主函数(main.c)代码部分:
#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(); OLED_Init(); Serial_Init(); OLED_ShowString(1, 1, "TxPacket"); OLED_ShowString(3, 1, "RxPacket"); //如果连续发送数据包,程序处理不及时,可能导致数据报错位,文本数据包独立,若错位,则全部错。 //因此需要每次都进行判断后处理下一个数据包 while (1) { if(Serial_RxFlag == 1)//注:此处与串口收发HEX文件不同,直接使用库函数进行判断 { OLED_ShowString(4,1," "); OLED_ShowString(4,1,Serial_RxPacket);//字符串 if(strcmp(Serial_RxPacket,"LED_ON")==0)//strcmp,判断字符串是否相等,需要头文件#include "string.h" { 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)//strcmp,判断字符串是否相等 { LED1_OFF(); Serial_SendString("LED_OFF_OK\r\n"); OLED_ShowString(2,1," "); OLED_ShowString(2,1,"LED_OFF_OK"); } else { Serial_SendString("ERROR_COMMND\r\n"); OLED_ShowString(2,1," "); OLED_ShowString(2,1,"ERROR_COMMND"); } Serial_RxFlag = 0; } } }
Serial.c代码部分:
#include "stm32f10x.h" // Device header #include <stdio.h> #include <stdarg.h> char Serial_RxPacket[100]; uint8_t Serial_RxFlag; //可变包长,含包头包尾,以@符号为包头,空格(\r\n)为包尾,中间载荷不固定 void Serial_Init(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; 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_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_Init(USART1, &USART_InitStructure); USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); 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) { 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); } 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)//包头是@,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 char Serial_RxPacket[]; extern uint8_t Serial_RxFlag; void Serial_Init(void); void Serial_SendByte(uint8_t Byte); void Serial_SendArray(uint8_t *Array, uint16_t Length); void Serial_SendString(char *String); void Serial_SendNumber(uint32_t Number, uint8_t Length); #endif