我需要使用串行端口接收和传输数据。我的接收和发送没有问题,但是我看不到接收到的数据。 如果我使用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;
从完美的串行连接中读取数据。 可能是什么问题?
答案 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;