0

我正在学习的课程中有一些代码,但我还没有机会对其进行测试。这是代码:

this.serialPort.Write(serialCommand);
Thread.Sleep(1000);
if (this.serialPort.ReadExisting().EndsWith(">"))
{
    return true;
}
else
{
    return false;
}

这是我要查找的字符串的样子:

"Some Returned Data\r\n16 >\r\n"

在视觉上看起来像这样:

"Some Returned Data  
 16 >"

如果我使用 ReadLine() 它不计算换行和回车。我会使用 ReadLine(),但我过去遇到过问题。我读取数据的常规方法是将 NewLine 令牌设置>为,因为这是表示设备已完成发出命令并写入缓冲区的返回令牌。

会在EndsWith(">")这里工作吗?或者它会失败,因为字符串在技术上以">\r\n"

4

2 回答 2

1

如果调用ReadExisting时缓冲区中的消息末尾有“\r\n”,则返回的数据应该包含它,并且应该是“Some Returned Data\r\n16 >\r\n”。

你可以做

if(returnedSrting.Trim().EndsWith(">")){...}

尽管当您使用 ReadExisting 和其他字符串方法(例如 Trim、EndsWith 和其他比较字符串的方法)时,您应该警惕为您的应用设置的 CurrentCulture。

MSDN:

正如在 .NET Framework 中使用字符串的最佳实践中所述,我们建议您避免调用替代默认值的字符串比较方法,而是调用需要显式指定参数的方法。

有时他们会对您的文本数据做一些您从未打算做的事情(特别是如果您的数据中有一些字符不在 ASCII 可打印字符范围内)。

int byteCount = serialPort.BytesToRead; 
byte[] buffer = new byte[byteCount];
serialPort.Read(buffer, 0, byteCount);

这样,您始终拥有真实的、未修改的数据,您可以稍后自行转换。

于 2013-09-18T14:03:24.277 回答
1

你可以做:

str.Trim().EndsWith(">");

或者

str.EndsWith(">\r\n");
于 2013-09-18T13:41:11.997 回答