从串行端口接收特殊字符

时间:2019-10-18 11:51:15

标签: c# serial-port

我需要使用串行端口接收和传输数据。我的接收和发送没有问题,但是我看不到接收到的数据。 如果我使用ComTestSerial程序,则会看到以下正确数据:

  

{STX} 1H | \ ^&||| cobas6000 ^ 1 |||||主机| RSUPL ^ BATCH | P | 1 P | 1 |||||| U ||||||| ^   O | 1 |安妮塔   BIS | 0 ^ 5016 ^ 1 ^^ S1 ^ SC | ^^^ 480 ^ | R |||||| N |||| 1 |||||||| 20191018113556 ||| F   C | 1 | I | ^ ^^^ | G   R | 1 | ^^^ 480 / | 11 | U / L {ETB} A6

但是,如果我在带有RicheditText或Texbox的c#中使用程序,则会看到以下错误数据:

  

2497212492943812412412499111989711554484848944912412412412412410411111511612482838580769466658467721248012449138012449124124124124124124124851241241241241241249413791244912432323232323232327365787869848465327732667383124489453484954944994948349948367124949494525648941248212412412412412412478124124124124491241241241241241241245048495749484956494951535354124124124701367124491247312432323232323232323232323232323232323232323232323232323232323294323232323232323232323232323232323232323232323232329494941247113821244912494949452564847124494912485477623655413104。

我使用这个简单的代码(由同事编写)来接收:

string cMsg = "";
while (this.ComPort.BytesToRead > 0)
{
    int nChar = this.ComPort.ReadChar();
    cMsg += nChar.ToString();
}
Thread.Sleep(100);
return cMsg;

从完美的串行连接中读取数据。 可能是什么问题?

2 个答案:

答案 0 :(得分:2)

您要将数字转换为字符串,因此,假设nChar为2时,输出将为字符串"2",而当nChar为49时,输出为字符串将为"49"

因此,该消息以{STX}1开头。 {STX}是ASCII控制代码2,而1是ASCII代码49。因此,“错误数据”以"249"开头。

因此,数据没有错,并且代码完全按照您的指示进行了操作,只不过您的同事并不表示您的意图:)

与其将ASCII代码转换为字符串,不如将它们转换为字符,并使用stringbuilder来最小化调整字符串大小的次数。

StringBuilder message(ComPort.BytesToRead);

while (ComPort.BytesToRead > 0)
{
    message.Append((char)ComPort.ReadChar());
}
return message.ToString();

但是您无需执行任何操作! SerialPort.ReadExisting做您想要做的事情:

return ComPort.ReadExisting();

样式说明:C#不是Java,使用this.乱扔代码也不是惯用的。除非有充分的理由,否则不要这样做。

答案 1 :(得分:0)

从您的代码看来,您似乎正在从端口中获取一个整数,并且在使用ToString()时,您只需在字符串中写一个数字

int nChar = this.ComPort.ReadChar();
cMsg += nChar.ToString();

此整数应为21位Unicode代码点。 因此,您只需使用Char.ConvertFromUtf32(Int32)方法,它将整数转换为实际字符:
https://docs.microsoft.com/en-us/dotnet/api/system.char.convertfromutf32?view=netframework-4.8
您的完整代码应如下所示:

string cMsg = "";
while (this.ComPort.BytesToRead > 0)
{
    int nChar = this.ComPort.ReadChar();
    cMsg += Char.ConvertFromUtf32(nChar);
}
Thread.Sleep(100);
return cMsg;