【问题标题】:Messagebox working in debug mode but not in normal run消息框在调试模式下工作但不能正常运行
【发布时间】:2016-07-31 09:42:54
【问题描述】:

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

应该是这样的:

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

【问题讨论】:

    标签: message box


    【解决方案1】:

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

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

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

    【讨论】:

    • 是的,谢谢我已经通过在串行数据接收中设置条件解决了这个问题。如果条件满足,那么只有我处理数据。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-09
      • 1970-01-01
      • 2017-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多