涉及三個實驗:
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_RxData=USART_ReceiveData(USART1);
?? ??? ?Serial_RxFlag=1;
?? ??? ?USART_ClearITPendingBit(USART1,USART_IT_RXNE);//清除標志位
?? ?}
1.1Serial.c串口模塊
#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);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_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 ;//發送字長為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_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);//發送數據寄存器是否發送完成,發送完成跳出循環
}//串口發送一個數組
// *Array 要發送數組的首地址
//Length 要發送數組的長度
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]);}
}//函 數:次方函數(內部使用)//返 回 值:返回值等于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(i=0;i<Length;i++)//根據數字長度遍歷數字的每一位{Serial_SendByte(Number/Serial_Pow(10,Length-i-1)%10+'0');}
}
//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_RxFlag==1)//接受數據標志位置1,接收到數據{Serial_RxFlag=0;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_RxData=USART_ReceiveData(USART1);Serial_RxFlag=1;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.h"uint8_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狀態機代碼
RxData=USART_ReceiveData(USART1);if(RxState==0)/*當前狀態為0,接收數據包包頭*/{if(RxData==0xFF)//如果數據確實是包頭{RxState = 1; //置下一個狀態pRxPacket = 0; //數據包的位置歸零}}else if(RxState==1)/*當前狀態為1,接收數據包數據*/{Serial_RxPacket[pRxPacket]=RxData;//將數據存入數據包數組的指定位置pRxPacket++;//數據包的位置自增if(pRxPacket>=4)//如果收夠4個數據{RxState=2;//置下一個狀態}}else if(RxState==2)/*當前狀態為2,接收數據包包尾*/{if(RxData==0xFE)//如果數據確實是包尾部{RxState=0;//狀態歸0Serial_RxFlag=1;//接收數據包標志位置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_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 ;//發送字長為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_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');}
}
//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_RxFlag==1)//接受數據標志位置1,接收到數據{Serial_RxFlag=0;return 1;}return 0;
}void USART1_IRQHandler(void)
{static uint8_t RxState=0;//定義表示當前狀態機狀態的靜態變量static uint8_t pRxPacket=0;//定義表示當前接收數據位置的靜態變量if(USART_GetITStatus(USART1,USART_IT_RXNE)==SET){//使用狀態機機制//接收數據包的狀態機RxData=USART_ReceiveData(USART1);if(RxState==0)/*當前狀態為0,接收數據包包頭*/{if(RxData==0xFF)//如果數據確實是包頭{RxState = 1; //置下一個狀態pRxPacket = 0; //數據包的位置歸零}}else if(RxState==1)/*當前狀態為1,接收數據包數據*/{Serial_RxPacket[pRxPacket]=RxData;//將數據存入數據包數組的指定位置pRxPacket++;//數據包的位置自增if(pRxPacket>=4)//如果收夠4個數據{RxState=2;//置下一個狀態}}else if(RxState==2)/*當前狀態為2,接收數據包包尾*/{if(RxData==0xFE)//如果數據確實是包尾部{RxState=0;//狀態歸0Serial_RxFlag=1;//接收數據包標志位置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.h"uint8_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_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 ;//發送字長為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_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); //將字節數據寫入數據寄存器,寫入后USART自動生成時序波形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');}
}
//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_RxFlag==1)//接受數據標志位置1,接收到數據{Serial_RxFlag=0;return 1;}return 0;
}void USART1_IRQHandler(void)
{static uint8_t RxState=0;//靜態變量只能在本函數內使用static uint8_t pRxPacket=0;if(USART_GetITStatus(USART1,USART_IT_RXNE)==SET){//接收數據包的狀態機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);//清除標志位}
}
3.3Serial.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);
void Serial_Printf(char *format, ...);#endif
3.4main.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初始化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; //處理完成后,需要將接收數據包標志位清零,否則將無法接收后續數據包}}
}