数据包规则定义
定长HEX数据包
以0xFF为开头,0xFE为包围,中间固定四个字节长度的数据
定长HEX数据包状态机程序编写
//HEX数据包状态机程序编写
void USART1_IRQHandler(void)
{
static uint8_t RxState = 0;
static uint8_t pxRxPacket = 0;
if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)== SET)
{
uint8_t RxData = USART_ReceiveData(USART1);
if (RxState==0)
{
if(RxData==0xFF)
{
RxState=1;
pxRxPacket=0;
}
}
else if (RxState==1)
{
Serial_RxPacket[pxRxPacket]=RxData;
pxRxPacket ++;
if (pxRxPacket>=4)
{
RxState = 2;
}
}
else if (RxState==2)
{
if(RxData==0xFE)
{
RxState=0;
Serial_RxFlag = 1;
}
}
}
}
不定长HEX数据包![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/7fcfedf773562e2b1d22c8b808de2123.png)
以0xFF为开头,0xFE为包围,中间字节长度不固定的数据
定长文本数据包![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/d53b0f81e6b35d132b0150b571f2752b.png)
不定长文本数据包![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/a585e2a57df28956c905d62e8bf6a9e7.png)
不定长文本数据包状态机程序编写
//文本数据包状态机程序编写
void USART1_IRQHandler(void)
{
static uint8_t RxState = 0;
static uint8_t pxRxPacket = 0;
if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)== SET)
{
uint8_t RxData = USART_ReceiveData(USART1);
if (RxState==0)
{
if(RxData=='@')
{
RxState=1;
pxRxPacket=0;
}
}
else if (RxState==1)
{
if(RxData=='\r') RxState=2;
else
{
Serial_RxPacket[pxRxPacket]=RxData;
pxRxPacket ++;
}
}
else if (RxState==2)
{
if(RxData=='\n')
{
RxState=0;
Serial_RxFlag = 1;
Serial_RxPacket[pxRxPacket]='\0';
}
}
}
}