普达建站快车,如何认识软件开发模型,自己怎样做公司广告视频网站,杭州海淀区网站建设涉及三个实验#xff1a;
1.USART串口发送和接收数据
我们使用的是将串口封装成为一个Serial.c模块.其中包含了
void Serial_Init(void);//串口初始化 void Serial_SendByte(uint8_t Byte);//串口发送一个字节 void Serial_SendArray(uint8_t *Array,uint16_t Length);//…涉及三个实验
1.USART串口发送和接收数据
我们使用的是将串口封装成为一个Serial.c模块.其中包含了
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);//串口发送数字uint8_t Serial_GetRxFlag(void);//串口接收标志位 uint8_t Serial_GetRxData(void);//接受数据模块
在这次实验中我们调用中断函数申请中断中断函数为USART1_IRQHandler(void) 同时也要判断在中断中数据接收标志位在最后也要清除中断数据接受标志位if(USART_GetITStatus(USART1,USART_IT_RXNE)SET) { Serial_RxDataUSART_ReceiveData(USART1); Serial_RxFlag1; USART_ClearITPendingBit(USART1,USART_IT_RXNE);//清除标志位 }
1.1Serial.c串口模块
#include stm32f10x.h // Device header
#include stdio.h
#include stdarg.huint8_t Serial_RxData;
uint8_t Serial_RxFlag;
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_Speed GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Pin GPIO_Pin_9;//引脚9为TX发送端GPIO_Init(GPIOB, GPIO_InitStructure);GPIO_InitStructure.GPIO_Mode GPIO_Mode_IPD;//上拉输入GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Pin GPIO_Pin_10;//引脚10为RX输入端口GPIO_Init(GPIOB, GPIO_InitStructure);//USART配置9600波特率 8位字长 1位停止位 无校验位 无硬件流控制 只有发送模式USART_InitTypeDef USART_InitStructure;USART_InitStructure.USART_BaudRate9600;//波特率USART_InitStructure.USART_HardwareFlowControlUSART_HardwareFlowControl_None;//硬件流控制选择无USART_InitStructure.USART_Mode USART_Mode_Tx | USART_Mode_Rx;//模式为发送信息USART_InitStructure.USART_ParityUSART_Parity_No;//无校验位USART_InitStructure.USART_StopBitsUSART_StopBits_1 ;//停止位占一位USART_InitStructure.USART_WordLengthUSART_WordLength_8b ;//发送字长为8bitUSART_Init(USART1,USART_InitStructure);//开启RXNE标志位到NVIC的输出一旦RXEN标志位置1就开始向NVIC申请中断之后我们就可以在中断里接受数据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_IRQChannelCmdENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority1;//指定抢占优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority1;//指定响应优先级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);//发送数据寄存器是否发送完成发送完成跳出循环
}//串口发送一个数组
// *Array 要发送数组的首地址
//Length 要发送数组的长度
void Serial_SendArray(uint8_t *Array,uint16_t Length)
{uint16_t i;for(i0;iLength;i)//遍历数组{Serial_SendByte(Array[i]);}
}//串口发送字符串
void Serial_SendString(char *String)
{uint8_t i;for(i0;String[i]!\0;i){Serial_SendByte(String[i]);}
}//函 数次方函数内部使用//返 回 值返回值等于X的Y次方
uint32_t Serial_Pow(uint32_t X,uint32_t Y)
{uint32_t Result 1;while(Y--){Result *X;}return Result;
}
//串口发送数字
//Number 要发送的数字范围0~4294967295
//Length 要发送数字的长度范围0~10
void Serial_SendNumber(uint32_t Number,uint8_t Length)
{uint8_t i;for(i0;iLength;i)//根据数字长度遍历数字的每一位{Serial_SendByte(Number/Serial_Pow(10,Length-i-1)%100);}
}
//fputc为printf的底层printf在打印的时候不断调用fputc函数
int fputc(int ch,FILE *f)
{Serial_SendByte(ch);//在这里我们把fputc函数重定向到串口那printf自然输出到串口return ch;
}//将printf打印的内容输出到串口
//将可变参数发送出去
void Serial_Printf(char *format,...)//format参数用来接收格式化字符串,...用来接收后面的可变参数列表
{char String[100];va_list arg;//定义一个参数列表变量va_start(arg,format);//从format位置开始接收参数表放在arg里vsprintf(String,format,arg);va_end(arg);//释放参数列表Serial_SendString(String);
}
//实现读后自动清除
uint8_t Serial_GetRxFlag(void)
{if(Serial_RxFlag1)//接受数据标志位置1接收到数据{Serial_RxFlag0;return 1;}return 0;
}
//变量封装返回接收到的数据
uint8_t Serial_GetRxData(void)
{return Serial_RxData;
}
void USART1_IRQHandler(void)
{if(USART_GetITStatus(USART1,USART_IT_RXNE)SET){Serial_RxDataUSART_ReceiveData(USART1);Serial_RxFlag1;USART_ClearITPendingBit(USART1,USART_IT_RXNE);//清除标志位}
} 1.2Serial.h函数
#ifndef __SERIAL_H
#define __SERIAL_Hvoid 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);//串口发送数字
void Serial_Printf(char *format,...);
uint8_t Serial_GetRxFlag(void);//接受数据标志位
uint8_t Serial_GetRxData(void);#endif
1.3 main.c函数
#include stm32f10x.h // Device header
#include Delay.h
#include OLED.h
#include Serial.huint8_t RxData; //定义用于接收串口数据的变量int main(void)
{OLED_Init(); //OLED初始化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); //显示串口接收的数据}}
}2.USART串口发送和接受HEX数据
在接受HEX数据包时使用一个状态机的理念。
2.1状态机代码 RxDataUSART_ReceiveData(USART1);if(RxState0)/*当前状态为0接收数据包包头*/{if(RxData0xFF)//如果数据确实是包头{RxState 1; //置下一个状态pRxPacket 0; //数据包的位置归零}}else if(RxState1)/*当前状态为1接收数据包数据*/{Serial_RxPacket[pRxPacket]RxData;//将数据存入数据包数组的指定位置pRxPacket;//数据包的位置自增if(pRxPacket4)//如果收够4个数据{RxState2;//置下一个状态}}else if(RxState2)/*当前状态为2接收数据包包尾*/{if(RxData0xFE)//如果数据确实是包尾部{RxState0;//状态归0Serial_RxFlag1;//接收数据包标志位置1成功接收一个数据包}} 2.2Serial.c串口模块
#include stm32f10x.h // Device header
#include stdio.h
#include stdarg.h
//这里的数据只存储发送和接受的载荷数据包头包尾不包含
uint8_t Serial_TxPacket[4];//发送的数据包
uint8_t Serial_RxPacket[4];//接收的数据包
uint8_t Serial_RxFlag;//收到数据标志位
uint8_t RxData;
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_Speed GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Pin GPIO_Pin_9;//引脚9为TX发送端GPIO_Init(GPIOB, GPIO_InitStructure);GPIO_InitStructure.GPIO_Mode GPIO_Mode_IPD;//上拉输入GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Pin GPIO_Pin_10;//引脚10为RX输入端口GPIO_Init(GPIOB, GPIO_InitStructure);//USART配置9600波特率 8位字长 1位停止位 无校验位 无硬件流控制 只有发送模式USART_InitTypeDef USART_InitStructure;USART_InitStructure.USART_BaudRate9600;//波特率USART_InitStructure.USART_HardwareFlowControlUSART_HardwareFlowControl_None;//硬件流控制选择无USART_InitStructure.USART_Mode USART_Mode_Tx | USART_Mode_Rx;//模式为发送信息USART_InitStructure.USART_ParityUSART_Parity_No;//无校验位USART_InitStructure.USART_StopBitsUSART_StopBits_1 ;//停止位占一位USART_InitStructure.USART_WordLengthUSART_WordLength_8b ;//发送字长为8bitUSART_Init(USART1,USART_InitStructure);//开启RXNE标志位到NVIC的输出一旦RXEN标志位置1就开始向NVIC申请中断之后我们就可以在中断里接受数据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_IRQChannelCmdENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority1;//指定抢占优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority1;//指定响应优先级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(i0;iLength;i){Serial_SendByte(Array[i]);}
}void Serial_SendString(char *String)
{uint8_t i;for(i0;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(i0;iLength;i){Serial_SendByte(Number/Serial_Pow(10,Length-i-1)%100);}
}
//fputc为printf的底层printf在打印的时候不断调用fputc函数
int fputc(int ch,FILE *f)
{Serial_SendByte(ch);//在这里我们把fputc函数重定向到串口那printf自然输出到串口return ch;
}//将printf打印的内容输出到串口
//将可变参数发送出去
void Serial_Printf(char *format,...)//format参数用来接收格式化字符串,...用来接收后面的可变参数列表
{char String[100];va_list arg;//定义一个参数列表变量va_start(arg,format);//从format位置开始接收参数表放在arg里vsprintf(String,format,arg);va_end(arg);//释放参数列表Serial_SendString(String);
}
//模块发送HEX数据包
void Serial_SendPacket(void)
{Serial_SendByte(0xFF);Serial_SendArray(Serial_TxPacket,4);Serial_SendByte(0xFE);
}
//实现读后自动清除
uint8_t Serial_GetRxFlag(void)
{if(Serial_RxFlag1)//接受数据标志位置1接收到数据{Serial_RxFlag0;return 1;}return 0;
}void USART1_IRQHandler(void)
{static uint8_t RxState0;//定义表示当前状态机状态的静态变量static uint8_t pRxPacket0;//定义表示当前接收数据位置的静态变量if(USART_GetITStatus(USART1,USART_IT_RXNE)SET){//使用状态机机制//接收数据包的状态机RxDataUSART_ReceiveData(USART1);if(RxState0)/*当前状态为0接收数据包包头*/{if(RxData0xFF)//如果数据确实是包头{RxState 1; //置下一个状态pRxPacket 0; //数据包的位置归零}}else if(RxState1)/*当前状态为1接收数据包数据*/{Serial_RxPacket[pRxPacket]RxData;//将数据存入数据包数组的指定位置pRxPacket;//数据包的位置自增if(pRxPacket4)//如果收够4个数据{RxState2;//置下一个状态}}else if(RxState2)/*当前状态为2接收数据包包尾*/{if(RxData0xFE)//如果数据确实是包尾部{RxState0;//状态归0Serial_RxFlag1;//接收数据包标志位置1成功接收一个数据包}}USART_ClearITPendingBit(USART1,USART_IT_RXNE);//清除标志位}
}
2.3Serial.h函数
#ifndef __SERIAL_H
#define __SERIAL_H#include stdio.h
extern uint8_t Serial_TxPacket[4];//外部可调用数组
extern uint8_t Serial_RxPacket[4];
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);
void Serial_Printf(char *format,...);uint8_t Serial_GetRxFlag(void);//这个函数判断是不是接收到了数据包void Serial_SendPacket(void);void USART1_IRQHandler(void);#endif
2.4 main.c函数
#include stm32f10x.h // Device header
#include Delay.h
#include OLED.h
#include Serial.h
#include Key.huint8_t KeyNum; //定义用于接收按键键码的变量int main(void)
{OLED_Init(); //OLED初始化Key_Init(); //按键初始化Serial_Init(); //串口初始化OLED_ShowString(1, 1, TxPacket);OLED_ShowString(3, 1, RxPacket);/*设置发送数据包数组的初始值用于测试*/Serial_TxPacket[0] 0x01;Serial_TxPacket[1] 0x02;Serial_TxPacket[2] 0x03;Serial_TxPacket[3] 0x04;while (1){KeyNum Key_GetNum(); //获取按键键码if (KeyNum 1) //按键1按下{Serial_TxPacket[0] ; //测试数据自增Serial_TxPacket[1] ;Serial_TxPacket[2] ;Serial_TxPacket[3] ;Serial_SendPacket(); //串口发送数据包Serial_TxPacketOLED_ShowHexNum(2, 1, Serial_TxPacket[0], 2); //显示发送的数据包OLED_ShowHexNum(2, 4, Serial_TxPacket[1], 2);OLED_ShowHexNum(2, 7, Serial_TxPacket[2], 2);OLED_ShowHexNum(2, 10, Serial_TxPacket[3], 2);}if (Serial_GetRxFlag() 1) //如果接收到数据包{OLED_ShowHexNum(4, 1, Serial_RxPacket[0], 2); //显示接收的数据包OLED_ShowHexNum(4, 4, Serial_RxPacket[1], 2);OLED_ShowHexNum(4, 7, Serial_RxPacket[2], 2);OLED_ShowHexNum(4, 10, Serial_RxPacket[3], 2);}}
}3.USART串口发送和接受文本数据
在接受文本数据包时使用一个状态机的理念
3.1状态机代码 if (USART_GetITStatus(USART1, USART_IT_RXNE) SET) //判断是否是USART1的接收事件触发的中断{uint8_t RxData USART_ReceiveData(USART1); //读取数据寄存器存放在接收的数据变量/*使用状态机的思路依次处理数据包的不同部分*//*当前状态为0接收数据包包头*/if (RxState 0){if (RxData Serial_RxFlag 0) //如果数据确实是包头并且上一个数据包已处理完毕{RxState 1; //置下一个状态pRxPacket 0; //数据包的位置归零}}/*当前状态为1接收数据包数据同时判断是否接收到了第一个包尾*/else if (RxState 1){if (RxData \r) //如果收到第一个包尾{RxState 2; //置下一个状态}else //接收到了正常的数据{Serial_RxPacket[pRxPacket] RxData; //将数据存入数据包数组的指定位置pRxPacket ; //数据包的位置自增}}/*当前状态为2接收数据包第二个包尾*/else if (RxState 2){if (RxData \n) //如果收到第二个包尾{RxState 0; //状态归0Serial_RxPacket[pRxPacket] \0; //将收到的字符数据包添加一个字符串结束标志Serial_RxFlag 1; //接收数据包标志位置1成功接收一个数据包}} 3.2Serial.c函数
#include stm32f10x.h // Device header
#include stdio.h
#include stdarg.h
//这里的数据只存储发送和接受的载荷数据包头包尾不包含char Serial_RxPacket[100];//接收的数据包
uint8_t Serial_RxFlag;//收到数据标志位
uint8_t RxData;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_Speed GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Pin GPIO_Pin_9;//引脚9为TX发送端GPIO_Init(GPIOB, GPIO_InitStructure);GPIO_InitStructure.GPIO_Mode GPIO_Mode_IPD;//上拉输入GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Pin GPIO_Pin_10;//引脚10为RX输入端口GPIO_Init(GPIOB, GPIO_InitStructure);//USART配置9600波特率 8位字长 1位停止位 无校验位 无硬件流控制 只有发送模式USART_InitTypeDef USART_InitStructure;USART_InitStructure.USART_BaudRate9600;//波特率USART_InitStructure.USART_HardwareFlowControlUSART_HardwareFlowControl_None;//硬件流控制选择无USART_InitStructure.USART_Mode USART_Mode_Tx | USART_Mode_Rx;//模式为发送信息USART_InitStructure.USART_ParityUSART_Parity_No;//无校验位USART_InitStructure.USART_StopBitsUSART_StopBits_1 ;//停止位占一位USART_InitStructure.USART_WordLengthUSART_WordLength_8b ;//发送字长为8bitUSART_Init(USART1,USART_InitStructure);//开启RXNE标志位到NVIC的输出一旦RXEN标志位置1就开始向NVIC申请中断之后我们就可以在中断里接受数据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_IRQChannelCmdENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority1;//指定抢占优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority1;//指定响应优先级NVIC_Init(NVIC_InitStructure);USART_Cmd(USART1,ENABLE);
}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)
{uint16_t i;for(i0;iLength;i){Serial_SendByte(Array[i]);}
}void Serial_SendString(char *String)
{uint8_t i;for(i0;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(i0;iLength;i){Serial_SendByte(Number/Serial_Pow(10,Length-i-1)%100);}
}
//fputc为printf的底层printf在打印的时候不断调用fputc函数
int fputc(int ch,FILE *f)
{Serial_SendByte(ch);//在这里我们把fputc函数重定向到串口那printf自然输出到串口return ch;
}//将printf打印的内容输出到串口
//将可变参数发送出去
void Serial_Printf(char *format,...)//format参数用来接收格式化字符串,...用来接收后面的可变参数列表
{char String[100];va_list arg;//定义一个参数列表变量va_start(arg,format);//从format位置开始接收参数表放在arg里vsprintf(String,format,arg);va_end(arg);//释放参数列表Serial_SendString(String);
}//实现读后自动清除
uint8_t Serial_GetRxFlag(void)
{if(Serial_RxFlag1)//接受数据标志位置1接收到数据{Serial_RxFlag0;return 1;}return 0;
}void USART1_IRQHandler(void)
{static uint8_t RxState0;//静态变量只能在本函数内使用static uint8_t pRxPacket0;if(USART_GetITStatus(USART1,USART_IT_RXNE)SET){//接收数据包的状态机RxDataUSART_ReceiveData(USART1);if(RxState0){if(RxData Serial_RxFlag 0){RxState1;pRxPacket0;}}else if(RxState1){if(RxData\r){RxState2;}else{Serial_RxPacket[pRxPacket]RxData;pRxPacket;}}else if(RxState2){if(RxData\n){RxState0;Serial_RxPacket[pRxPacket]\0;Serial_RxFlag1;}}USART_ClearITPendingBit(USART1,USART_IT_RXNE);//清除标志位}
}
3.3Serial.h函数
#ifndef __SERIAL_H
#define __SERIAL_H#include stdio.hextern 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);
void Serial_Printf(char *format, ...);#endif3.4main.c函数
#include stm32f10x.h // Device header
#include Delay.h
#include OLED.h
#include Serial.h
#include LED.h
#include string.hint main(void)
{/*模块初始化*/OLED_Init(); //OLED初始化LED_Init(); //LED初始化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); //OLED清除指定位置并显示接收到的数据包/*将收到的数据包与预设的指令对比以此决定将要执行的操作*/if (strcmp(Serial_RxPacket, LED_ON) 0) //如果收到LED_ON指令{LED1_ON(); //点亮LEDSerial_SendString(LED_ON_OK\r\n); //串口回传一个字符串LED_ON_OKOLED_ShowString(2, 1, );OLED_ShowString(2, 1, LED_ON_OK); //OLED清除指定位置并显示LED_ON_OK}else if (strcmp(Serial_RxPacket, LED_OFF) 0) //如果收到LED_OFF指令{LED1_OFF(); //熄灭LEDSerial_SendString(LED_OFF_OK\r\n); //串口回传一个字符串LED_OFF_OKOLED_ShowString(2, 1, );OLED_ShowString(2, 1, LED_OFF_OK); //OLED清除指定位置并显示LED_OFF_OK}else //上述所有条件均不满足即收到了未知指令{Serial_SendString(ERROR_COMMAND\r\n); //串口回传一个字符串ERROR_COMMANDOLED_ShowString(2, 1, );OLED_ShowString(2, 1, ERROR_COMMAND); //OLED清除指定位置并显示ERROR_COMMAND}Serial_RxFlag 0; //处理完成后需要将接收数据包标志位清零否则将无法接收后续数据包}}
}