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

我遇到了通过串口通信的程序的问题。 它必须发送和接收的一个字符是度符号,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位操作?

您的问题是ASCIIEncoding是一个7位编码。 您正在寻找支持扩展ASCII的东西。

以下将为您提供代码页1252 。

 System.Text.Encoding.GetEncoding(1252); 

这将获得ISO 8859-1 。

 System.Text.Encoding.GetEncoding(28591); 

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

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

 port.Encoding = Encoding.GetEncoding(28591); 

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