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

时间:2014-08-26 10:17:00

标签: c# serial-port

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

 ComPort.Write(data);

2 个答案:

答案 0 :(得分:2)

严格来说ASCII只包含128个可能的符号 您需要使用不同的字符集来发送除33个控制字符以外的任何字符以及94个ASCII字母和符号。

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

  1. Extended_ASCII这是ASCII,其中包含128个字符。
  2. ISO 8859-1是ASCII,表示所有西欧语言都需要所有字符。
  3. Windows-1252是ISO 8859-1,有一些更改(包括0x80-0x9F范围内的可打印字符)。
  4. ISO 8859-2,相当于东欧语言。
  5. Windows-1250也适用于东欧语言,但与8859-2几乎没有相似之处。
  6. UTF-8也派生自ASCII,但具有128到255之间的不同字符。
  7. 回到您的问题:您的编码设置为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);