2016-07-31 19 views
1

Ich mache eine Software für GSM-Modem. Es funktioniert bei der seriellen Kommunikation mit AT-Befehlen. Wir geben ihm AT-Befehle und es antwortet über serielle Kommunikation. Ich gebe ihm einen Befehl, das Guthaben in einer SIM AT+CUSD=1,"*141#" zu überprüfen. Seine Antwort ist wie folgt:Messagebox im Debug-Modus, aber nicht im normalen Lauf

Jetzt möchte ich dies auf einer Messagebox anzeigen. Dies ist der kleine Code verwende ich:

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); 
} 

Nun, wenn ich Haltepunkt setzen und den Code debuggen, es funktioniert und zeigen komplette data in Meldungsfeld, aber wenn ich es laufen normalerweise zeigt es nur wenige Zeichen in Nachrichtenbox . Wie folgt aus:

enter image description here

Stattdessen sollte es so sein:

enter image description here

Das Problem, was ich gefunden habe, ist, wenn debuggen alle Daten, Inhalte, die in der 2. Bild dargestellt wird speichern in Datenvariable, so dass es vollständig im Meldungsfeld angezeigt wird. Aber im normalen Lauf werden die vollständigen Daten nicht in den Zeichenkettendaten empfangen, weshalb sie weniger Daten zeigen, als im ersten Bild gezeigt. Wie man dieses Problem löst. Was könnte der Grund sein? Bitte helfen Sie.

Antwort

1

Dies ist ein typisches Verhalten für eine serielle Schnittstelle. Sie sind sehr langsam. Wenn das DataReceived-Ereignis ausgelöst wird, erhalten Sie normalerweise nur ein oder zwei Zeichen. Bemerkenswert ist, dass es gut funktioniert, wenn Sie debuggen, weil das einzelne Durchlaufen des Codes der seriellen Schnittstelle viel Zeit gibt, zusätzliche Zeichen zu erhalten. Aber es wird Kaboom gehen, sobald Sie ohne einen Debugger laufen, weil die Zeichenfolge nicht lang genug ist.

Sie müssen den Code ändern, indem Sie die Zeichenfolge, die Sie erhalten, an eine Zeichenfolgenvariable im Klassenbereich anhängen. Parsen Sie die Zeichenfolge erst, nachdem Sie alle erwarteten Zeichen erhalten haben. Sie benötigen eine Möglichkeit zu wissen, dass Sie die vollständige Antwort erhalten haben. Bei den meisten typischen seriellen Geräten wird die Zeichenfolge mit einem Sonderzeichen beendet. Oft ein Zeilenvorschub.

Wenn dies der Fall ist, können Sie es leicht machen, indem Sie die Eigenschaft SerialPort.NewLine auf diesen Terminator setzen und ReadLine() anstelle von ReadExisting() aufrufen.

+0

Ja danke Ich habe das Problem gelöst indem ich eine Bedingung auf serielle Daten empfange. Wenn die Bedingung erfüllt ist, dann verarbeite ich nur die Daten. –

0

Sie sollten ReadExisting aufrufen, bis eine leere Zeichenfolge zurückgegeben wird und die Ergebnisse mit den Daten bei jedem Aufruf verknüpft werden. Vielleicht hat der Debug-Modus einen größeren Lesepuffer für den seriellen Port als der normale Modus.