1.HEX数据包
2.文本数据包
3.HEX数据包接收思路
4.文本数据包接收思路
5.接发HEX数据包代码
前面的定义部分不需要改变,首先写我们发送数据包的代码
void Serial_SendPacket(uint8_t *Packet)
{
Serial_SendByte(0xff);//发送包头
Serial_SendArray(Packet,4);//发送数据
Serial_SendByte(0xfe);//发送包尾
}
然后我们使用状态机的方法写接收数据包的代码
void USART1_IRQHandler(void)
{
static uint8_t Rx_stat=0;
static uint8_t stat=0;
if(USART_GetITStatus(USART1,USART_IT_RXNE) == SET)//判断是否为接收中断
{
Serial_Data = USART_ReceiveData(USART1);
if(Rx_stat == 0)
{
if(Serial_Data == 0xff)
{
Rx_stat=1;
}
}
else if(Rx_stat == 1)
{
Serial_RxPacket[stat]=Serial_Data;
stat++;
if(stat>=4)
{
Rx_stat=2;
stat=0;
}
}
else if(Rx_stat == 2)
{
if(Serial_Data == 0xfe)
{
Rx_stat=0;
Serial_RXFlag=1;
}
}
USART_ClearITPendingBit(USART1,USART_IT_RXNE);
}
}
6.接发文本数据包
void USART1_IRQHandler(void)
{
static uint8_t Rx_stat=0;
static uint8_t stat=0;
if(USART_GetITStatus(USART1,USART_IT_RXNE) == SET)//判断是否为接受中断
{
Serial_Data = USART_ReceiveData(USART1);
if(Rx_stat == 0)
{
if(Serial_Data == '@' && Serial_RXFlag == 0)
{
Rx_stat=1;
stat=0;
}
}
else if(Rx_stat == 1)
{
if(Serial_Data == '\r')
{
Rx_stat =2;
}
else
{
Serial_RxPacket[stat]=Serial_Data;
stat++;
}
}
else if(Rx_stat == 2)
{
if(Serial_Data == '\n')
{
Rx_stat=0;
Serial_RxPacket[stat]='\0';
Serial_RXFlag=1;
}
}
USART_ClearITPendingBit(USART1,USART_IT_RXNE);
}
}
通过比较接收到的数据包与特定字符串相同的字符串时,启动特定的能力。STRCMP函数。
int main(void)
{
Serial_Init();
OLED_Init();
LED_Init();
OLED_ShowString(1,1,"TXPacket:");
OLED_ShowString(3,1,"RXPacket:");
while(1)
{
if(Serial_GetRxFlag() == 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_OFF();
Serial_SendString("LED_OFF_OK\r\n");
OLED_ShowString(2,1," ");
OLED_ShowString(2,1,"LED_OFF_OK");
}
else
{
Serial_SendString("ERROR_COMMANE\r\n");
OLED_ShowString(2,1," ");
OLED_ShowString(2,1,"ERROR_COMMANE");
}
Serial_RXFlag=0;
}
}
}