2016-07-31 70 views
1

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

enter image description here

相反,它应该是这样的:

enter image description here

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

回答

1

这是串行端口的典型行为。他们非常慢。 DataReceived事件触发时,通常只会获得一个或两个字符。值得注意的是,它在调试时效果很好,因为单步执行代码会给串口接收更多字符带来很多时间。但是,只要你没有调试器就运行,它会去Kaboom,因为字符串不够长。

您需要修改代码,方法是将收到的字符串附加到类作用域的字符串变量中。只有在收到您期望的所有字符后才解析字符串。您需要一些方法才能知道您已收到完整回复。大多数串行设备通常会用特殊字符来终止字符串。通常是换行。

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

+0

是的,谢谢我已经通过在串行数据接收条件下解决了这个问题。如果条件满足,那么只有我处理数据。 –

0

您应该调用ReadExisting直到返回空字符串,并将结果连接到每个调用的数据。也许调试模式对于串行端口具有比正常模式更大的读取缓冲区。

相关问题