[英]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.