项目中要使用串口通信,要对数据进行解包,找出需要的数据。对不符合协议的数据丢弃,要求可以对数据进行干扰,在数据前后都可以插入扰乱数据。通过程序解析出需要的数据,下位机C语言单片机代码如下:
//数据解包
void DataAnalysis() {
u16 i = 0;
if(length <200) {//数据长度小于200
for(i = 0 ; i<length; i++) {
if(receiLen == 0 && USART_RX_BUF[i] == 0xab) {//包头1
buff[receiLen] = USART_RX_BUF[i];
receiLen = 1;
} else if(receiLen == 1 && USART_RX_BUF[i] == 0xcd) {//包头2
buff[receiLen] = USART_RX_BUF[i];
receiLen = 2;
} else if(receiLen == 1 && USART_RX_BUF[i] != 0xcd) {//找到包头1 但是包头2不对 则重新计数
receiLen = 0;
}
else if(receiLen != 0) {//数据
buff[receiLen] = USART_RX_BUF[i];
receiLen++;
}
if(receiLen != 0 && buff[receiLen-2] == 0xdc &&buff[receiLen-1] == 0xba) {//检测到包尾正确退出
break;
}
}
if(receiLen != 0 && (buff[receiLen-2] != 0xdc || buff[receiLen-1] != 0xba)) {//检测到包尾错误退出,接收数据缓冲区长度清零
receiLen = 0;
}
} else {
// printf("数据超长\r\n");
receiLen = 0;
}
//--------打印数据---------------
if(receiLen != 0) {
// printf("数据接收完成! 数据长度-> %d \r\n",receiLen);
SendHex(buff,receiLen);
receiLen = 0;
}
}
调用程序
int main() {
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
uart_init(115200);
delay_init();
while(1) {
if(USART_RX_STA & 0X8000) {
length = USART_RX_STA & 0X3FFF;//0-13位保存数据长度
// printf("数据长度:length = %d\r\n\n",length);
DataAnalysis();
USART_RX_STA = 0;
} else {
delay_ms(10);
}
}
}
该代码是一种设计思想,适用与各种开发语言。