Как применить кодировку при чтении с последовательного порта - PullRequest
2 голосов
/ 26 апреля 2010

Я читаю данные с последовательного порта. Я прочитал это сообщение: http://social.msdn.microsoft.com/Forums/en-US/vbgeneral/thread/a709d698-5099-4e37-9e10-f66ff22cdd1e

Он пишет о многих проблемах, с которыми я сталкиваюсь, но в своем письме он ссылается на использование: System.Text.Encoding.GetEncoding ("Windows-1252"). У меня проблема, когда и как это применить. На мой взгляд, есть три пятна. Когда объект последовательного порта определен:

private SerialPort comport = new SerialPort();

Обработчик событий:

comport.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);

Или при чтении данных:

string data = comport.ReadExisting();

Неважно, куда я его добавлю. Кажется, я получаю ошибки. Как использовать кодировку?

Ответы [ 2 ]

9 голосов
/ 26 апреля 2010

Вы должны установить соответствующую кодировку перед отправкой или получением данных, чтобы конструктор был хорошим выбором.

var sp = new SerialPort
{
    Encoding = Encoding.GetEncoding("Windows-1252")
};

Если после этого у вас все еще возникают проблемы с получением данных, вам необходимо убедиться, что данные, отправляемые на последовательный порт, соответствуют указанной вами кодировке («Windows-1252»).

6 голосов
/ 26 апреля 2010

Вместо использования ReadExisting используйте метод порта Read, чтобы получить байты, а затем преобразовать их в строку с нужной кодировкой, например:

void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    SerialPort port = (SerialPort)sender;
    byte[] data = new byte[port.BytesToRead];
    port.Read(data, 0, data.Length);
    string s = Encoding.GetEncoding("Windows-1252").GetString(data);
}

Обновление: Вот более простая, по-прежнему-C # -2.0-дружественная версия, основанная на ответе Жуана. После создания экземпляра объекта SerialPort установите его свойство Encoding следующим образом:

port.Encoding = Encoding.GetEncoding("Windows-1252");

Тогда ваш метод DataReceived становится именно таким:

void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    SerialPort port = (SerialPort)sender;
    string s = port.ReadExisting();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...