SerialPort编码 - 如何获得8位ASCII?

时间:2011-08-24 16:04:54

标签: c# .net serial-port

我遇到了通过串口通信的程序的问题。它必须发送和接收的一个字符是度符号,ASCII 0xBF。它已经工作好多年了,现在突然串口对象开始丢失第7位,所以我得到0x3F而不是0xBF。

我确信这是我做过的傻事,因为我在那个区域修改了我的代码 - 但是我看不出我做了什么导致了第8位的丢失。

我的端口初始化如下:

    BaudRate              9600  int  
    DataBits              8 int  
    DiscardNull true    bool
    DtrEnable             true  bool
    Encoding    {System.Text.ASCIIEncoding} System.Text.Encoding                  Handshake           None  System.IO.Ports.Handshake
    NewLine           "\n"  string
    Parity            None  System.IO.Ports.Parity
    ParityReplace   63  byte
    PortName              "COM4"    string
    ReadBufferSize  128 int
    ReadTimeout 250 int
    ReceivedBytesThreshold  1   int
    RtsEnable             true  bool
    StopBits              One   System.IO.Ports.StopBits
    WriteBufferSize 64  int
    WriteTimeout    1500    int

如何将端口恢复为8位操作?

3 个答案:

答案 0 :(得分:11)

您的问题是ASCIIEncoding是7位编码。您正在寻找支持Extended ASCII的内容。

以下内容将为您提供Codepage 1252

System.Text.Encoding.GetEncoding(1252);

这会让你ISO 8859-1

System.Text.Encoding.GetEncoding(28591);

这两个都被认为是Extended ASCII,并且两者都包含通常与此集相关联的符号(通常具有相同的字节表示),例如©,¥和º。有关每种编码中包含哪些字符的详细信息,请参阅参考链接。

答案 1 :(得分:3)

System.Text.ASCIIEncoding不是用于8位通信的正确编码。而是使用例如“ISO 8859-1 Latin 1; Western European(ISO)”代码页:

port.Encoding = Encoding.GetEncoding(28591);

答案 2 :(得分:0)

1252和28591中的度数符号似乎是xB0,而不是xBF。