我修改了一个例子来发送&从串口接收,并且工作正常。
我连接的设备有三个我需要使用的命令。 我的经验是C。
MAP - 返回field_names,(十进制)值列表& (十六进制)地址 我可以跟踪哪些值以十进制或十六进制形式返回。 每行以CR终止 :: 示例:
会员:10 - (十进制)会员名称数量
NAME_LENGTH:每个名称字符串的 - (十进制)长度
NAME_BASE:0A34 - 10个(15)字符的c字符串,每个字符从地址(0x0A34)开始(每个空终结符后面可能有垃圾)
等
GET hexaddr hexbytecount - 返回从(hexaddr)开始的2字符十六进制值列表。
返回的字节是bytes / ints / long的混合,以及以CR终止的以null结尾的c字符串 :: 示例 ::
获取0a34 10 - 将返回
0A34< 54 65 73 74 20 4D 65 20 4F 75 74 00 40 D3 23 0B
这恰好是'测试我(00)其次是垃圾 等
PUT hexaddr hexbytevalue {{value ...} {value ...}} 发送多个十六进制字节值,以十六进制地址开头的空格分隔,以CR / LF结尾
这些字节是bytes / ints / long的混合,null终止c-strings :: 示例:
把0a34 50 75 73 68 - (ascii Push)
将替换0x0A34的前4个字符变为' 推送我输出
SAVED OK
答案 0 :(得分: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);
其中: - 跳过字符串直到&lt;字符,然后将其余部分拆分为十六进制字符串
然后,将每个十六进制字符串转换为整数(基数为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
中有很好的文档记录