2016-12-14 35 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 –

相关问题