我修改了一个从串行发送和接收的示例,这很好。
我连接到的设备有三个命令,我需要使用。我的经验是C。
MAP -返回一个field_names、(十进制)值和(十六进制)地址的列表,我可以跟踪哪些值作为十进制或十六进制返回。每一行都以CR ::示例结尾
成员:10(十进制)成员名
每个名称字符串的NAME_LENGTH:15 -(十进制)长度
从地址(0x0A34)开始的(15)字符的NAME_BASE:0A34 -10c字符串(可能在每个空终止符后面有垃圾)
等。
GET 十六进制-返回从(十六进制)开始的2-字符十六进制值的列表。
返回的字节是字节/int/long和以CR ::示例::以空终止的c-字符串的混合。
get 0a34 10 --将返回
0A34< 54 65 73 74 20 4D 65 20 4F 75 74 00 40 D3 23 0B
这恰好是'Test‘(00),后面是垃圾等等。
将十六进制值{{值.}发送多个十六进制字节值,从十六进制地址开始,以CR/LF结束
这些字节是字节/int/long和以空结尾的c-字符串::示例的混合。
投0a34 50 75 73 68 - (ascii推杆)
将取代0x0A34的前4个字符成为“Push Me Out”
保存好
发布于 2016-12-14 22:52:02
请参阅我先前关于串行处理的答案,这可能是有用的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);

其中:-跳过字符串直到<字符之后,然后将其余字符串拆分为十六进制字符串
然后,将每个十六进制字符串转换为into (基数为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"));

此外,您还会发现使用十六进制数据在https://msdn.microsoft.com/en-us/library/bb311038.aspx中有很好的文档记录。
https://stackoverflow.com/questions/41153355
复制相似问题