0

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

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

这是原始数据文件:

http://pastebin.com/dx4HetT0

4

1 回答 1

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
于 2013-08-08T16:04:38.090 回答