如何将流数据(字符串)解析为不同的数据文件
how to parse stream data(string) to different data files
@大家,我最近在读取IMU数据时遇到了一些问题。
下面是我从我的设备上得到的数据,它是ASCII,都是字符,我的数据大小是[122],这真的很大,我需要将它们转换为short,然后float,但我不知道为什么以及如何.....
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
我只想:
- 提取以逗号分隔的最后 6 个数字,顺便说一句,我不需要最后 3 个字符(如 *66)。
- 将提取的数据保存到6个.dat文件。
最好的方法是什么?
因为我从IMU得到了这个原始数据,我需要最后6个数据,它们是accelerations(x,y,z)
和gyros(x,y,z)
。
- 如果有人能告诉我如何在每个数据流的末尾设置一个计数器,那将是完美的,因为我还需要 IMU 的时间戳。
最后一句话是我在 windows、c++ 下进行数据采集。
希望有人能帮助我,我因为有太多事情要做而感到害怕,这真的很烦人!!
有一整套 scanf 函数(fscanf、sscanf 和一些 "secure" 函数)。
假设您已将一行读入字符串:-
sscanf( s, "VNYMR,%*f,%*f,%*f,%*f,%*f,%*f,%f,%f,%f,%f,%f,%f", &accX, &accY, &accZ, &gyroX, &gyroY, &gyroZ )
假设我没数错!这将验证文字 $VNYMR 是否存在,然后是您未分配的大约五个浮点数,最后是您关心的六个。 &accaX 等是您的浮点数的地址。测试结果 - 分配的数量..
@大家,我最近在读取IMU数据时遇到了一些问题。 下面是我从我的设备上得到的数据,它是ASCII,都是字符,我的数据大小是[122],这真的很大,我需要将它们转换为short,然后float,但我不知道为什么以及如何.....
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
我只想:
- 提取以逗号分隔的最后 6 个数字,顺便说一句,我不需要最后 3 个字符(如 *66)。
- 将提取的数据保存到6个.dat文件。
最好的方法是什么?
因为我从IMU得到了这个原始数据,我需要最后6个数据,它们是accelerations(x,y,z)
和gyros(x,y,z)
。
- 如果有人能告诉我如何在每个数据流的末尾设置一个计数器,那将是完美的,因为我还需要 IMU 的时间戳。
最后一句话是我在 windows、c++ 下进行数据采集。
希望有人能帮助我,我因为有太多事情要做而感到害怕,这真的很烦人!!
有一整套 scanf 函数(fscanf、sscanf 和一些 "secure" 函数)。 假设您已将一行读入字符串:-
sscanf( s, "VNYMR,%*f,%*f,%*f,%*f,%*f,%*f,%f,%f,%f,%f,%f,%f", &accX, &accY, &accZ, &gyroX, &gyroY, &gyroZ )
假设我没数错!这将验证文字 $VNYMR 是否存在,然后是您未分配的大约五个浮点数,最后是您关心的六个。 &accaX 等是您的浮点数的地址。测试结果 - 分配的数量..