我有一个嵌入式微控制器系统,通过uart与我的计算机进行通信,此时开发应该是自己发送有效数据。我已触发此设备的“扫描”,其作用是将自动读取的数据发送到主机设备。我现在有一个文本文件,其中包含原始十六进制数据值,可以进行处理。我发送的数据包以0x54开头并以0x55结尾,它们分为4个(每个“读取”4个数据包)。一个数据包在0x54之后包含两个“标识符”字节,然后是一堆6个字节用于数据,每个数据包总共10个字节。根据数据包标识符,其中的数据可以是浮点数或整数。
我基本上想要设计一个命令行程序,该程序接收包含所有这些数据的原始文本文件,并输出一个文本文件,在数据包之间分隔逗号,数据转换为可读的十进制数据。每个第4个转换后的数据包的新行非常有用。我想在C中做这个(我相对精通编译嵌入式C,我可以很容易地在类型之间来回转换十六进制值)但我没有太多编写C可执行文件的经验。任何帮助开始这个小小的迷你项目都会很棒。我需要知道如何创建命令行可控制的可执行文件,读入数据文件,操作数据(我认为我现在可以做),然后将数据导出到另一个文件。我已经安装了netbeans c / c ++。正确方向的指针是我所需要的(没有双关语意图=])
这是原始数据文件:
答案 0 :(得分:0)
数据没有太大的变化来确定地推断出字节,但以下内容应该启动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