C# 如何将大于127的ASCII值发送到串行端口

C# 如何将大于127的ASCII值发送到串行端口,c#,serial-port,C#,Serial Port,每当我向com端口发送任何大于127的ASCII值时,我都会在串行端口获得垃圾输出值 ComPort.Write(data); 更改串行端口上的编码后,问题得到解决 this.ComPort.Encoding = Encoding.GetEncoding(28591); 严格地说,只包含128个可能的符号。 您需要使用不同的字符集来发送除33个控制字符和94个ASCII字母和符号以外的任何内容 为了使事情更加混乱,ASCII被用作几个较大冲突字符集的起点。 该列表并不全面,但最常见的是:

每当我向com端口发送任何大于127的ASCII值时,我都会在串行端口获得垃圾输出值

 ComPort.Write(data);

更改串行端口上的编码后,问题得到解决

this.ComPort.Encoding = Encoding.GetEncoding(28591);
严格地说,只包含128个可能的符号。 您需要使用不同的字符集来发送除33个控制字符和94个ASCII字母和符号以外的任何内容

为了使事情更加混乱,ASCII被用作几个较大冲突字符集的起点。 该列表并不全面,但最常见的是:

它是ASCII码,包含128个字符。 是ASCII,包含表示所有西欧语言所需的所有字符。 是ISO 8859-1,有一些改动,包括0x80-0x9F范围内的可打印字符。 这相当于东欧语言。 也用于东欧语言,但与8859-2几乎没有相似之处。 也派生自ASCII,但具有128到255之间的不同字符。 回到您的问题:您的编码设置为ASCII,因此您无法发送该字符集之外的任何字符。您需要为正在发送的数据将编码设置为适当的字符集。根据我的经验,在美国和西欧,Windows-1252是最常用的

在C语言中,您可以通过串行端口发送字符串或字节。如果发送字符串,它将使用将该字符串转换为要发送的字节。您可以根据自己的目的将其设置为适当的编码,也可以使用对象手动转换字符串

在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));

嗯,不,那个代码页缺少0x80到0x9F。写字节而不是字符。当我在应用程序中将编码从28591改为Windows-1252时,在串行端口,我得到了ASCII值150的垃圾值。对于其他字符,输出不变!对于小于127的值,我希望输出保持不变。对于值>127,应将字符转换为可通过串行端口发送的字节值。你能用第二个例子说明你想发送什么,你得到的垃圾价值是多少吗?windows-1252中的字符150是反勾:`这就是您要发送的吗?我要发送的字符是0x96连字符-当使用windows-1252时,我在输出中得到的是问号。问号?是默认字符。如果未知,则.net将替换为。如果它用问号代替,那么它就不能进行编码。你能试试我的第二个例子吗?你可以手动进行编码,看看这是否适合你?