Messagebox 在调试模式下工作但不在正常模式下 运行

Messagebox working in debug mode but not in normal run

我正在为 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,但是当我 运行 时,它通常只在消息框中显示几个字符。像这样:

应该是这样的:

我发现的问题是,当调试第二张图片中显示的所有数据内容时,它们都保存在数据变量中,因此它完全显示在消息框中。但是当在正常 运行 中时,字符串数据中没有收到完整的数据,这就是为什么它显示的数据较少,如第一张图片所示。如何解决这个问题。可能是什么原因。请帮忙。

您应该调用 ReadExisting 直到返回空字符串,在每次调用时将结果连接到数据。可能debug模式比普通模式有更大的串口读缓冲区。

这是串行端口的典型行为。他们非常慢。当 DataReceived 事件触发时,您通常只会收到一两个字符。值得注意的是,它在调试时运行良好,因为单步执行代码为串行端口提供了大量时间来接收其他字符。但是一旦你 运行 没有调试器,它就会开始 Kaboom,因为字符串不够长。

您需要通过将收到的字符串附加到 class 范围内的字符串变量来修改代码。只有在收到所有预期的字符后才解析字符串。您需要通过某种方式知道您已收到完整的回复。大多数典型的串行设备将以特殊字符终止字符串。通常换行。

如果是这种情况,那么您可以通过将 SerialPort.NewLine 属性 设置为该终止符并调用 ReadLine() 而不是 ReadExisting() 来简化它。