将原始十六进制通信数据日志处理为可读值

时间:2013-08-08 09:58:39

标签: c++ c command-line command-line-arguments command-prompt

我有一个嵌入式微控制器系统,通过uart与我的计算机进行通信,此时开发应该是自己发送有效数据。我已触发此设备的“扫描”,其作用是将自动读取的数据发送到主机设备。我现在有一个文本文件,其中包含原始十六进制数据值,可以进行处理。我发送的数据包以0x54开头并以0x55结尾,它们分为4个(每个“读取”4个数据包)。一个数据包在0x54之后包含两个“标识符”字节,然后是一堆6个字节用于数据,每个数据包总共10个字节。根据数据包标识符,其中的数据可以是浮点数或整数。

我基本上想要设计一个命令行程序,该程序接收包含所有这些数据的原始文本文件,并输出一个文本文件,在数据包之间分隔逗号,数据转换为可读的十进制数据。每个第4个转换后的数据包的新行非常有用。我想在C中做这个(我相对精通编译嵌入式C,我可以很容易地在类型之间来回转换十六进制值)但我没有太多编写C可执行文件的经验。任何帮助开始这个小小的迷你项目都会很棒。我需要知道如何创建命令行可控制的可执行文件,读入数据文件,操作数据(我认为我现在可以做),然后将数据导出到另一个文件。我已经安装了netbeans c / c ++。正确方向的指针是我所需要的(没有双关语意图=])

这是原始数据文件:

http://pastebin.com/dx4HetT0

1 个答案:

答案 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