簡體   English   中英

將原始十六進制通信數據日志處理為可讀值

[英]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 ++。 我只需要指向正確方向的指針即可(無需雙關語=])

這是原始數據文件:

http://pastebin.com/dx4HetT0

數據的變化不大,可以肯定地推斷出字節,但是以下操作應該可以啟動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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM