常用字符串解析与处理方法

常用字符串解析与处理方法

DanielLee   2014-9-25


       工作一年多来,发现经常会用到字符串的解析与处理,比如编写路由器控制软件时,要对路由器返回的命令进行解析;对GPS注册网络时要进行命令的组合与返回值的判断;采集北斗数据时,要从标准GGA、GSA、RMC等协议中分类参数等等,其实都是如何处理字符串的问题,把字符串处理好,可以很容易的处理命令的交互。

一、字符串中变量提取

      ① scanf,可以通过特定的格式将一个字符串的变量直接分离出来,如下:

对“IPAddr=192.168.2.1:12345,ID=25535,Time=3,Speed=10END”进行参数提取可以用

paraCnt= sscanf(paraStr,"%[^=]=%[^:]:%[^,],%[^,],%[^,],%[^E]",headerTemp,ipAddrTemp,portTemp,idTemp,timeTemp,aralmSpeedTemp)来处理。这其中有4个变量,提取方法简单。值得注意的是其中几个数字的长度是会发生变化的,如果单纯靠字符的位置进行解析有时是会出错的,scanf利用特殊符号进行分隔可以有效解决这个问题。

       再举一个例子,如果你需要处理GPS或BD发来的定位信息,例如“$GPGGA,063952.000,4002.229934,N,11618.096855,E,1,4,2.788,37.254,M,0,M,,*71”

每条字符串可能包含很多变量,有的甚至可达20-30个,再使用之前的方法显然会很不方便。这时可以结合字符串设置的规则与scanf,比如在GPS或BD协议中每个变量之间都使用“,”隔开,这样通过查询是第几个变量后再通过scanf就可以把变量提取出来了。

       使用这个方法在字符串提取浮点数时尤为有用。

       ②专用库函数。我们很容易遇到去判断与解析比如IP地址、MAC地址、子网掩码等字符串的情况,如果自己去实现是需要花一点时间编写和调试,后来发现可以使用NetASCII_Str_to_MAC()、NetASCII_MAC_to_Str()、NetASCII_Str_to_IP()、NetASCII_IP_to_Str()等一系列的函数去处理,即简单又可靠,岂不是比自己写省时省事,高大上多了。

二、变量转为字符串

      sprintf(),主要功能是把格式化的数据写入某个字符串中,是个变参函数。例如通过以下方式就可以把存储在数组中的IP地址转化为AT指令中的字符串命令了

      strcat(TCPCmd,(char*)"AT+CIPSTART=\"TCP\",\"");

      for(i=0;i<3;i++){

        sprintf(tempBuf,"%d",IPpara[i]);

        strcat(TCPCmd,tempBuf);

        strcat(TCPCmd,(char *)".");

     }

三、其他

       在处理浮点数时,也会遇到与数组转换的情况,通常是设置一个结构体或共用体,来逐字节的读出,把浮点数转为数组比较或存储,反过来逐字节存入后,整体读出就可以得到浮点数的值了。

你可能感兴趣的:(STM32)