严格来讲ASCII http://en.wikipedia.org/wiki/ASCII仅包含 128 个可能的符号。
您将需要使用不同的字符集来发送除 33 个控制字符和 94 个 ASCII 字母和符号之外的任何内容。
更令人困惑的是,ASCII 被用作几个较大(冲突)字符集的起点。
此列表并不全面,但最常见的是:
-
扩展_ASCII http://en.wikipedia.org/wiki/Extended_ASCII这是 ASCII 码,其中还有 128 个字符。
-
ISO 8859-1 http://en.wikipedia.org/wiki/ISO/IEC_8859-1是 ASCII,包含表示所有西欧语言所需的所有字符。
-
Windows-1252 http://en.wikipedia.org/wiki/Windows-1252是 ISO 8859-1,有一些更改(包括 0x80-0x9F 范围内的可打印字符)。
-
ISO 8859-2 http://en.wikipedia.org/wiki/ISO/IEC_8859-2这相当于东欧语言。
-
Windows-1250 http://en.wikipedia.org/wiki/Windows-1250也适用于东欧语言,但与 8859-2 几乎没有相似之处。
-
UTF-8 http://en.wikipedia.org/wiki/Utf-8也源自 ASCII,但具有从 128 到 255 的不同字符。
回到您的问题:您的编码设置为 ASCII,因此您无法发送该字符集之外的任何字符。您需要将编码设置为适合您发送的数据的字符集。根据我的经验(美国和西欧确实如此)Windows-1252 是最常用的。
在 C# 中,您可以通过串行端口发送字符串或字节。如果您发送一个字符串,它会使用串口编码 http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.encoding(v=vs.110).aspx将该字符串转换为要发送的字节。您可以根据您的目的将其设置为适当的编码,或者您可以手动转换字符串系统.文本.编码 http://msdn.microsoft.com/en-us/library/system.text.encoding(v=vs.110).aspx object.
在com端口上设置编码器:
ComPort.Encoding = Encoding.GetEncoding("Windows-1252");
或手动编码字符串:
System.Text.Encoding enc = System.Text.Encoding.GetEncoding("Windows-1252");
byte[] sendBuffer = enc.GetBytes(command);
ComPort.write(sendBytes, 0, sendBuffer.Length);
两者在功能上都做同样的事情。
编辑:
0x96 是 Windows-1252 中的有效字符
这会输出一个长连字符。 (正常连字符是0x2D)
System.Text.Encoding enc = System.Text.Encoding.GetEncoding("windows-1252");
byte[] buffer = new byte[]{0x96};
Console.WriteLine(enc.GetString(buffer));