每当我向com端口发送任何大于127的ASCII值时,我都会在串口上获得垃圾输出值。
ComPort.Write(data);
答案 0 :(得分:2)
严格来说ASCII只包含128个可能的符号 您需要使用不同的字符集来发送除33个控制字符以外的任何字符以及94个ASCII字母和符号。
为了使事情更加混乱,ASCII被用作几个较大(冲突)字符集的起点。 此列表并不全面,但最常见的是:
回到您的问题:您的编码设置为ASCII,因此您无法发送该字符集之外的任何字符。您需要将编码设置为要发送的数据的相应字符集。根据我的经验(无可否认地在美国和西欧),Windows-1252是最常用的。
在C#中,您可以通过串行端口发送字符串或字节。如果发送字符串,它会使用SerialPort.Encoding将该字符串转换为要发送的字节。您可以根据需要将其设置为适当的编码,也可以手动转换使用System.Text.Encoding对象转换字符串。
在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));
答案 1 :(得分:1)
当串口上的编码发生变化时,问题得以解决。
this.ComPort.Encoding = Encoding.GetEncoding(28591);