2016-12-14 63 views
1

我修改了一個示例發送&從串行接收,並且工作正常。解析十六進制/創建傳出字符串

我要連接的設備有三個我需要使用的命令。 我的經驗是C.


MAP - 返回FIELD_NAMES的列表,(十進制)值&(十六進制)地址 我可以跟蹤它的值返回爲十進制或十六進制。 每行的末端是CR ::

MEMBERS:10 - 的(十進制)成員名稱數

NAME_LENGTH:15 - (十進制)每名的字符串的長度

NAME_BASE:0A34 - (15)的字符的每個起始地址(0x0A34)(可以具有以下的垃圾每個空終止)

C - 字符串


GET hexaddrhexbytecount - 返回的(hexaddr)開始2炭的十六進制值的列表。

返回的字節是字節/整數/多頭的混合,和空終止與CR :: 例終止 ::

得到0a34 10 C字符串 - 將返回

0A34 < 54 65 73 74 20 4D 65 20 4F 75 74 00 40 D3 23 0B

這恰好是'測試我脫離'(00),接着垃圾 等


PUT hexaddr hexbytevalue {{值...} {價值... ...}}發送由空格隔開的多個六角字節值起始於十六進制地址,由CR/LF終止

這些字節字節/整數/多頭的混合,和空終止C字符串::

放0a34 50 75 73 68 - (ASCII推送)

將在0x0A34替換第一4-字符成爲 '我脫離'

SAVED行

回答

0

見我的答案之前約串行處理,這可能是Serial Port Polling and Data handling

,以實際文本您迴應轉換有用: -

var s = "0A34 < 54 65 73 74 20 4D 65 20 4F 75 74 00 40 D3 23 0B"; 

var hex = s.Substring(s.IndexOf("<") + 1).Trim().Split(new char[] {' '}); 
var numbers = hex.Select(h => Convert.ToInt32(h, 16)).ToList(); 
var toText = String.Join("",numbers.TakeWhile(n => n!=0) 
    .Select(n => Char.ConvertFromUtf32(n)).ToArray()); 
Console.WriteLine(toText); 

enter image description here

其中: - 跳過通過串直到<字符後,再將剩下的字符拆分成十六進制字符串

然後,將每個十六進制字符串到整數(基部16)

然後,取每個號碼直到它找到一個0和轉換每個數(使用UTF32編碼)

然後到文本中,我們加入所有經轉換的串在一起,以重新創建原始文本

可替換地,更多的冷凝

var hex = s.Substring(s.IndexOf("<") + 1).Trim().Split(new char[] {' '}); 
var bytes = hex.Select(h => (byte) Convert.ToInt32(h, 16)).TakeWhile(n => n != 0); 
var toText = Encoding.ASCII.GetString(bytes.ToArray()); 

,用於將從一個數字以十六進制: -

Console.WriteLine(123.ToString("X")); 
Console.WriteLine(123.ToString("X4")); 
Console.WriteLine(123.ToString("X8")); 
Console.WriteLine(123.ToString("x4")); 

enter image description here

還你會發現十六進制數據的播放是有據可查的,在https://msdn.microsoft.com/en-us/library/bb311038.aspx

+0

非常感謝基斯 - 我需要插上這一點,看看我學習! 是的 - 生成十六進制不應該這麼難學習新的函數調用!從一開始就從頭開始是一件我幾乎沒有穹頂的事情! –

+0

新增了一部分關於轉換爲十六進制.... –

+0

這些是我必須學習的!因此,NET –

相關問題