从串口接收特殊字符

Receive special char from serial port

我需要用串口收发数据。我接收和传输都没有问题,但我没有正确看到接收到的数据。 如果我使用程序 ComTestSerial,我会看到这些正确的数据:

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

但是如果我在 C# 中使用我的程序,使用 RicheditText 或 Texbox,我会看到这个错误的数据:

2497212492943812412412499111989711554484848944912412412412412410411111511612482838580769466658467721248012449138012449124124124124124124124851241241241241241249413791244912432323232323232327365787869848465327732667383124489453484954944994948349948367124949494525648941248212412412412412412478124124124124491241241241241241241245048495749484956494951535354124124124701367124491247312432323232323232323232323232323232323232323232323232323232323294323232323232323232323232323232323232323232323232329494941247113821244912494949452564847124494912485477623655413104.

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

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

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

从你的代码来看,你似乎是从你的端口获取一个整数,当你使用 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;

您正在将数字转换为字符串,因此,当 nChar 为 2 时,输出将是字符串 "2",而当 nChar 为 49 时,输出将是 "49".

因此,消息以 {STX}1 开头。 {STX} 是 ASCII 控制码 2,1 是 ASCII 码 49。因此 "wrong data" 以 "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. 乱扔代码既不符合习惯也没有必要。除非有充分的理由,否则不要这样做。