从串口接收特殊字符
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.
乱扔代码既不符合习惯也没有必要。除非有充分的理由,否则不要这样做。
我需要用串口收发数据。我接收和传输都没有问题,但我没有正确看到接收到的数据。 如果我使用程序 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.
乱扔代码既不符合习惯也没有必要。除非有充分的理由,否则不要这样做。