使用C语言linux风格编写解析代码,全局数据数组com_data[256],该数组的长度com_data_len,解析com_data数组中AT+CLEAN,AT+DISC,AT+STATE?,AT+RESET数据,使用switch语句,当com_data_len小于7时退出解析,数据可能会有断包,不能使用字符串对比函数和内存对比函数
时间: 2023-11-28 22:48:57 浏览: 73
c语言的面试题-stu.docx
以下是使用C语言linux风格编写解析代码的示例:
```c
int parse_com_data(unsigned char* com_data, int com_data_len) {
int i;
unsigned char cmd[8];
int cmd_len = 0;
for (i = 0; i < com_data_len; i++) {
if (com_data[i] == '+') {
cmd_len = 1;
cmd[0] = '+';
} else if (cmd_len > 0 && cmd_len < 8) {
cmd[cmd_len++] = com_data[i];
if (cmd_len == 7) {
switch (cmd[1]) {
case 'C':
if (cmd[2] == 'L' && cmd[3] == 'E' && cmd[4] == 'A' && cmd[5] == 'N') {
// 解析 AT+CLEAN 命令
return 1;
}
break;
case 'D':
if (cmd[2] == 'I' && cmd[3] == 'S' && cmd[4] == 'C') {
// 解析 AT+DISC 命令
return 2;
}
break;
case 'S':
if (cmd[2] == 'T' && cmd[3] == 'A' && cmd[4] == 'T' && cmd[5] == 'E' && cmd[6] == '?') {
// 解析 AT+STATE? 命令
return 3;
}
break;
case 'R':
if (cmd[2] == 'E' && cmd[3] == 'S' && cmd[4] == 'E' && cmd[5] == 'T') {
// 解析 AT+RESET 命令
return 4;
}
break;
default:
break;
}
cmd_len = 0;
}
}
}
return 0;
}
```
该函数接收两个参数,一个是unsigned char类型的com_data数组指针,另一个是com_data数组的长度com_data_len。函数首先定义了一个长度为8的字符数组cmd和一个整型变量cmd_len,用于存储当前正在解析的AT命令,然后使用for循环遍历com_data数组。当遇到'+'字符时,表示一个新的AT命令开始,此时将'+'字符存入cmd数组的第一个位置,并将cmd_len置为1。当cmd_len大于0且小于8时,表示当前正在解析AT命令中,此时将当前字符存入cmd数组的下一个位置,并判断是否已经解析完整个AT命令。当cmd_len等于7时,表示AT命令已经解析完毕,此时使用switch语句判断AT命令的类型,并返回相应的值。如果没有匹配的AT命令,则直接跳过。解析完所有的AT命令后,如果仍未返回结果,则返回0表示未解析出有效的AT命令。在解析过程中,由于不能使用字符串对比函数和内存对比函数,因此采取了逐个比较字符的方式进行解析。
阅读全文