我正在为GSM调制解调器制作软件。它使用AT命令进行串行通信。我们给它提供AT命令,它通过串行通信响应。我给它一个命令来检查SIM卡AT+CUSD=1,"*141#"
中的余额。它的回答是这样的:
+CUSD: 0, "Your balance is ... xxxxxxx "
现在我想在消息框上显示它。这是我正在使用的小代码:
String data = serialPort1.ReadExisting(); //to receive serial data and store it in data strig
logsTextBox.AppendText(data); // display it in text box
logsTextBox.AppendText("\n");
if (data.Contains("+CUSD:"))
{
MessageBox.Show(data);
}
现在,当我放置断点并调试代码时,它正常工作并在消息框中显示完整的data
但是当我正常运行它时,它在消息框中只显示几个字符。像这样:
相反它应该是这样的:
我发现的问题是调试时第二个图像中显示的所有数据内容都保存在数据变量中,因此它完全显示在消息框中。但是在正常运行时,字符串数据中不会收到完整的数据,这就是为什么它显示的数据较少,如第一张图片所示。如何解决这个问题。可能是什么原因。请帮忙。
答案 0 :(得分:1)
这是串行端口的典型行为。它们非常慢。触发DataReceived事件时,您通常只会获得一个或两个字符。值得注意的是,它在调试时运行良好,因为单步执行代码可以为串行端口提供大量时间来接收其他字符。但是,如果你在没有调试器的情况下运行它就会进入Kaboom,因为字符串不够长。
您需要通过将您收到的字符串附加到类范围的字符串变量来修改代码。只有在收到了预期的所有字符后才解析字符串。您需要某种方式来了解您已收到完整回复。大多数情况下,串行设备将使用特殊字符终止字符串。通常是换行。
如果是这种情况,那么您可以通过将SerialPort.NewLine属性设置为该终结符并调用ReadLine()而不是ReadExisting()来轻松实现。
答案 1 :(得分:0)
您应该调用ReadExisting,直到返回空字符串,将结果连接到每次调用的数据。也许调试模式对串行端口的读缓冲区比正常模式更大。