如何从串口读取时应用编码

rro*_*oss 2 c# encoding serial-port

我正在从串口读取数据.我看了这篇帖子: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();
Run Code Online (Sandbox Code Playgroud)

事件处理程序:

comport.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
Run Code Online (Sandbox Code Playgroud)

或者在阅读数据时:

string data = comport.ReadExisting();
Run Code Online (Sandbox Code Playgroud)

无论我在哪里添加它.我似乎得到了错误.如何使用编码?

Joã*_*elo 9

您应该在发送或接收数据之前设置适当的编码,因此构造函数是一个不错的选择.

var sp = new SerialPort
{
    Encoding = Encoding.GetEncoding("Windows-1252")
};
Run Code Online (Sandbox Code Playgroud)

如果在此之后仍然无法接收数据,则需要确保发送到串行端口的数据采用您指定的编码("Windows-1252").


Mus*_*sis 6

而不是使用ReadExisting,使用port的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);
}
Run Code Online (Sandbox Code Playgroud)

更新: 根据João的回答,这是一个更简单,仍然是C#-2.0的友好版本.实例化SerialPort对象后,设置其Encoding属性如下:

port.Encoding = Encoding.GetEncoding("Windows-1252");
Run Code Online (Sandbox Code Playgroud)

那么你的DataReceived方法就变成了这样:

void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    SerialPort port = (SerialPort)sender;
    string s = port.ReadExisting();
}
Run Code Online (Sandbox Code Playgroud)