C++ 如何将流数据(字符串)解析为不同的数据文件

C++ 如何将流数据(字符串)解析为不同的数据文件,c++,parsing,serial-port,data-stream,C++,Parsing,Serial Port,Data Stream,@各位,我最近在读IMU的数据时遇到了一些问题。 下面是我从我的设备上得到的数据,它是ASCII码,都是字符,我的数据大小是[122],非常大,我需要将它们转换成短的,然后浮起,但我不知道为什么以及如何 unsigned char data[33]; short x,y,z; float x_fl,y_fl,z_fl,t_fl; float bias[3]={0,0,0};//array initialization unsigned char sum_data=0; int batch=0;

@各位,我最近在读IMU的数据时遇到了一些问题。 下面是我从我的设备上得到的数据,它是ASCII码,都是字符,我的数据大小是[122],非常大,我需要将它们转换成短的,然后浮起,但我不知道为什么以及如何

unsigned char data[33];
short x,y,z;
float x_fl,y_fl,z_fl,t_fl;
float bias[3]={0,0,0};//array initialization
unsigned char sum_data=0;
int batch=0;
if ( !PurgeComm(file,PURGE_RXCLEAR ))
    cout << "Clearing RX Buffer Error" << endl;//this if two sentence aim to clean the buffer

//---------------- read data from IMU ----------------------
do { ReadFile(file,&data_check,1,&read,NULL);
       //if ((data_check==0x026))
       { ReadFile(file,&data,33,&read,NULL); }

       ///  Wx Values               
       {
          x=(data[8]<<8)+data[9];                               
          x_fl=(float)6.8664e-3*x;                                                  
          bias[0]+=(float)x_fl;                                               
        }

        ///  Wy Values                                      
        {
          y=(data[10]<<8)+data[11];
          y_fl=(float)6.8664e-3*y;
          bias[1]+=(float)y_fl;                                                 
        }

        ///  Wz Values                      
        {
          z=(data[12]<<8)+data[13];
          z_fl=(float)6.8664e-3*z; 
          bias[2]+=(float)z_fl;                                                 
        }

        batch++;

}while(batch<NUM_BATCH_BIAS);

$VNYMR,+049.320,-017.922,-024.946,+00.2829,-00.2734,+00.2735,-02.961,+03.858,-08.325,-00.001267,+00.000213,-00.001214*64

$VNYMR,+049.322,-017.922,-024.948,+00.2829,-00.2714,+00.2735,-02.958,+03.870,-08.323,+00.004923,-00.000783,+00.000290*65

$VNYMR,+049.321,-017.922,-024.949,+00.2821,-00.2655,+00.2724,-02.984,+03.883,-08.321,+00.000648,-00.000391,-00.000485*61

$VNYMR,+049.320,-017.922,-024.947,+00.2830,-00.2665,+00.2756,-02.983,+03.874,-08.347,-00.003416,+00.000437,+00.000252*6C

$VNYMR,+049.323,-017.921,-024.947,+00.2837,-00.2773,+00.2714,-02.955,+03.880,-08.326,+00.002570,-00.001066,+00.000690*67

$VNYMR,+049.325,-017.922,-024.948,+00.2847,-00.2715,+00.2692,-02.944,+03.875,-08.344,-00.002550,+00.000638,+00.000022*6A

$VNYMR,+049.326,-017.921,-024.945,+00.2848,-00.2666,+00.2713,-02.959,+03.876,-08.309,+00.002084,+00.000449,+00.000667*6A
无符号字符数据[33];
短x,y,z;
浮动x_fl,y_fl,z_fl,t_fl;
浮动偏置[3]={0,0,0}//数组初始化
无符号字符和数据=0;
int批=0;
如果(!PurgeComm(文件,清除)

cout有一整套scanf函数(fscanf、sscanf和一些“安全”函数)。 假设您已将一行读入字符串:-

sscanf( s, "VNYMR,%*f,%*f,%*f,%*f,%*f,%*f,%f,%f,%f,%f,%f,%f", &accX, &accY, &accZ, &gyroX, &gyroY, &gyroZ )

假设我数对了!这将验证文本$VNYMR是否存在,后面是大约五个未分配的浮点,最后是您关心的六个浮点&accaX等是您的浮动地址。测试结果-所做作业的数量

你试过什么了吗?写任何代码。请查看scanf的手册页面。它允许您检测但不指定某些数字,也可以指定其他数字。它会告诉你它分配了多少,所以你可以检查它是否找到了你想要的。如果那些逗号是空格,你会怎么做?scanf会跳过空白,问题是我正在从设备读取数据,通过每个读取循环,我从设备中获得7批数据。每个批次我都需要读取数据并将其存储到一个文件中,我需要将6个参数存储到6个文件中。我的回答没有提到主要的循环和写入。我认为您遇到的问题是解析每一行并只处理一些浮动。到目前为止,您编写了什么来处理文件的读写操作?请发布您的代码。do{ReadFile(hPort,&data,122,&read,NULL);if(batch==0){for(inti=0;i<122;i++){fprintf(pFile,“%c”,data[i]);}请看上面的更新版本,非常感谢,上面的代码实际上是在计算偏差,但是我的目标是获得acc和陀螺仪,我相信你可以知道发生了什么,如果你知道串行通信,我将数据大小设置为122,以获得附在代码末尾的结果。我知道这很混乱,但你知道我在做什么想要基于你给我的sscanf,如果只有一个字符串,这似乎解决了问题。。。。