|
while(1)
{
//串口接收判断
if(USART_GetFlagStatus(USART2, USART_FLAG_RXNE))
{
//接收到1个char
acTempChar = 0;
acTempChar = (USART_ReceiveData(USART2) & 0xFF);//接收程序
acRecBuffer[aiNumber++] = acTempChar;
//当接收的数据个数超过协议的个数的时候,抛弃重新接收
if(aiNumber > CMD_SIZE ) //此处的CMD_SIZE相当于你开头的 EB 90 EB 90 4个字节
{
aiNumber = 0;
memset(acRecBuffer, 0, CMD_SIZE);
continue;
}
//检测,保留完整的协议数据
if((SYNC_CHARACTER == acRecBuffer[aiNumber - 1]) && (8!= aiNumber))
{
auNumOfSyncChar++;
}
else
{
//当本次接收的同步数据少于3个的时候,数据错误
//重新接收
//此处就是判断接收的数据和协议是否一样,不一样就抛弃,我这里的同步数据是3个0xaa
if(auNumOfSyncChar < 3)
{
aiNumber = 0;
memset(acRecBuffer, 0, CMD_SIZE);
auNumOfSyncChar = 0;
continue;
}
if(CMD_SIZE == aiNumber)
{
aiNumber = 0;
auNumOfSyncChar = 0;
giIdentify = ID_GPS_COM_PROT;
}
}
switch(giIdentify)
{
//协议处理函数
case ID_GPS_COM_PROT:
//这里替换为你的数据处理函数
DB_gbMainDataProcessFunction(*((ComProStr*)acRecBuffer));
aiNumber = 0;
memset(acRecBuffer, 0, CMD_SIZE);
giIdentify = 0;
break;
default:
break;
}
}
}
这是我的一个程序的下位机接收上位机协议并处理的函数,你改改就能适合你所说的情况了,关键是流程你看懂就ok了,另外你应该加个末尾判断的,不过和协议头判断的差不多。 |
|