Кодировка SerialPort - как мне получить 8-битный ASCII? - PullRequest
1 голос
/ 24 августа 2011

У меня проблема с программой, которая связывается через последовательный порт.Одним из символов, которые он должен отправить и получить, является символ степени, 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 ]

11 голосов
/ 24 августа 2011

Ваша проблема в том, что ASCIIEncoding является 7-битной кодировкой. Вы ищете что-то, что поддерживает Extended ASCII .

Следующее вы получите Кодовая страница 1252 .

System.Text.Encoding.GetEncoding(1252);

Это даст вам ISO 8859-1 .

System.Text.Encoding.GetEncoding(28591);

Обе они считаются расширенной ASCII и обе содержат символы (в основном с одинаковым байтовым представлением), обычно связанные с этим набором, например & # x00A9; , & # x00A5; и & # x00BA; , См. Ссылки для получения дополнительной информации о том, какие символы включены в каждую кодировку.

3 голосов
/ 24 августа 2011

System.Text.ASCIIEncoding не подходит для 8-битной связи. Вместо этого используйте, например, кодовая страница "ISO 8859-1 Latin 1; западноевропейская (ISO)":

port.Encoding = Encoding.GetEncoding(28591);
0 голосов
/ 04 сентября 2011

Символ степени в 1252 и 28591 выглядит как xB0, а не xBF.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...