[英]processing a raw hex communication data log into readable values
我有一个嵌入式微控制器系统,该系统通过uart与我的计算机进行通信,在这一点上,应该自己发送有效数据。 我触发了对该设备的“扫描”,然后它的作用是将读取的数据自动发送到主机设备。 我现在有一个文本文件,其中有原始十六进制数据值,可以进行处理。 我正在发送以0x54开始并以0x55结尾的数据包,这些数据包以4个为单位(每个“读取”仪器4个数据包)。 数据包在0x54之后包含两个“标识符”字节,然后是一堆6个字节的数据,每个数据包总共10个字节。 根据数据包标识符,其中的数据可以是浮点数或整数。
我基本上想设计一个命令行程序,该程序将一个包含所有这些数据的原始文本文件接收,然后输出一个文本文件,在数据包之间用逗号分隔,并将数据转换为可读的小数形式。 每转换第4个数据包换一条新线将非常有用。 我想用C做到这一点(我比较熟练地编码嵌入式C,并且可以轻松地在类型之间来回转换十六进制值),但是我没有太多的编写C可执行文件的经验。 在这个小型迷你项目上的任何帮助都会很棒。 我需要知道如何创建命令行可控制的可执行文件,读取数据文件,操纵数据(我想我现在可以做到)然后将数据导出到另一个文件。 我已经安装了netbeans c / c ++。 我只需要指向正确方向的指针即可(无需双关语=])
这是原始数据文件:
数据的变化不大,可以肯定地推断出字节,但是以下操作应该可以启动OP。
void db_parse(FILE *outf, const unsigned char *s) {
fprintf(outf, "%c", *s++);
fprintf(outf, " %3u", *((uint8_t *) s));
s += sizeof(uint8_t);
uint8_t id1 = *((uint8_t *) s);
fprintf(outf, " %3u", *((uint8_t *) s));
s += sizeof(uint8_t);
if (id1 >= 3) {
fprintf(outf, " %13e", *((float *) s));
s += sizeof(float);
} else {
fprintf(outf, " %13u", *((uint32_t *) s));
s += sizeof(uint32_t);
}
fprintf(outf, " %5u", *((uint16_t *) s));
s += sizeof(uint16_t);
fprintf(outf, " %c\n", *s);
}
// Test code below
const char *h4 =
"54 12 04 00 00 40 C0 00 00 55 54 12 01 02 00 00 00 00 00 55 54 12 02 03 00 00 00 00 00 55 54 12 03 00 00 40 C0 00 00 55 ";
void db_test() {
unsigned char uc[10];
const char *s = h4;
while (*s) {
for (int i = 0; i < 10; i++) {
unsigned x;
sscanf(s, "%x", &x);
uc[i] = x;
s += 3;
}
db_parse(stdout, uc);
}
}
输出量
T 18 4 -3.000000e+00 0 U
T 18 1 2 0 U
T 18 2 3 0 U
T 18 3 -3.000000e+00 0 U
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.