2017-02-23 2 views
1

Ich schreibe eine GUI für Modem-Kommunikations-Tool, in der Lage, AT-Befehl zu empfangen und auch das Ergebnis von Modem nach der Ausführung in Modem zurückgeben. Ich benutze serial port dataReceived Ereignis, um die empfangenen Daten zu behandeln, aber es enthält nicht nur die Antwort vom Modem, sondern auch den AT-Befehl, den ich gebe. Jetzt denke ich, es ist, weil:Serial Port Leseergebnis enthält Antwort aber auch den Befehl, den ich gebe, wie man das löst?

1) auf Befehl von meiner GUI

2) Modem erhalten sie senden, dann auslösen DataReceived Ereignisse

3) Modem führt den Befehl, die Antwort auch DataReceived Ereignisse auslösen .

4) die empfangenen Daten dann meinen gegebenen Befehl enthalten beide und auch die Antwort

Zum Beispiel:

Input: AT + COPS = 0

Output: AT + COPS = 0OK (OK ist modem response)

Input: AT

Output: ATOK (OK ist modem response)

Ich konnte keine Lösung in MSDN finden. Gibt es zwei verschiedene Puffer in Modem? Wie löst man das?

Hier ist mein Code:

void serialPort_DataReceived(object s, SerialDataReceivedEventArgs e) 
{ 

    if (e.EventType != SerialData.Chars) 
    { 
     return; 
    } 
    try 
    { 
     System.Threading.Thread.Sleep(1000); 
     string indata = atPort.ReadExisting(); 
     string status = timeStamp.ToShortDateString() + " " + timeStamp.ToUniversalTime() + " " + "Read from Modem: " + indata; 
     this.Invoke(new MethodInvoker(delegate() { this.listBox_CommandOutput.Items.Add(status); })); 
    } 
    catch (Exception ex) 
    { 

    } 
} 


private void executeCommandLine() 
{ 
    if (this.textBox_CommandLine.Text != "") 
    { 
     try 
     { 
      atPort.DiscardInBuffer(); 
      atPort.DiscardOutBuffer(); 
      this.atPort.Write(this.textBox_CommandLine.Text.ToString()+"\\r"); 
      this.listBox_CommandOutput.Items.Add(timeStamp.ToShortDateString() + " " + timeStamp.ToUniversalTime() + " " + "Write to Modem: " + this.textBox_CommandLine.Text.ToString()); 

     } 
     catch (Exception exc) 
     { 
      this.listBox_CommandOutput.Items.Add(exc.ToString()); 
     } 
    } 
    else MessageBox.Show("Command can't be void.", "COM talk", MessageBoxButtons.OK); 

}

Antwort

3

Das Problem ist in Ihrem Code nicht. Einige Modems verwenden standardmäßig standardmäßig den Echo-Modus: Sie geben jedes an sie gesendete Zeichen an den Sender zurück (so dass Sie sie wie ein Terminal verwenden können).

Sie können den Echo-Modus mit dem Befehl AT deaktivieren:

ATE0 
+1

Perfect, funktioniert es, ich sehe nicht, Befehl zu wiederholen Ich gebe. Vielen Dank! – Aaron

Verwandte Themen