Hallo
Ich habe da ein ziemlich nerviges Problem mit dem SerialPort. Ich versuche mit einem Modem an einem Com Port über AT Befehle zu kommunizieren. Ich habe einen Konstruktor, der mir erstmal ein Modem Objekt erstellt:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| public SiemensSMSModem(String port) { this.sp.PortName=port; if(this.sp.IsOpen) this.sp.Close(); this.sp.BaudRate=SiemensSMSModem.BAUD_RATE; this.sp.DataBits=SiemensSMSModem.DATA_BITS; this.sp.StopBits=SiemensSMSModem.STOP_BITS; this.sp.Parity=SiemensSMSModem.PARITY; this.sp.Handshake=SiemensSMSModem.HANDSHAKE; this.sp.ReadTimeout=SiemensSMSModem.READ_TIMEOUT; this.sp.WriteTimeout=SiemensSMSModem.WRITE_TIMEOUT; this.sp.Open(); } |
und danach folgt eine Routine die erstmal das Modem nach dem Firmware String abfragt:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27:
| public override bool isItMe(){ this.sp.DataReceived+=this.onDataReceived; this.sendAndWait("ATI\r"); char[] splitter=new char[1]; Regex r=new Regex("SIEMENS"); splitter[0]='\r'; if(r.IsMatch(this.bufferString)){ String[] buff=bufferString.Split(splitter); this.name=buff[1]; this.type=buff[2]; this.version=buff[3]; this.sendAndWait("AT+CPMS=MT\r"); return true; } else if(this.errorPattern.IsMatch(bufferString)) throw new RosTesterException("Fehler"); else return false; } |
Mein Problem ist nun: Das Modem antwortet nicht, genauer, nicht direkt auf den Befehl. In meinem Empfangspuffer steht nichts drin. Rufe ich aber HTerm an dem Port auf, sehe ich direkt die Antowrt. Diese steht also scheinbar im FIFO, aber c# kommt über
C#-Quelltext
1:
| this.bufferString=this.sp.ReadExisting(); |
nicht ran. Auch diverse Pausen zwischen senden und empfangen helfen nicht weiter. Setze ich aber einen zweiten Befehl ab, erhalte ich als Antwort die Antowrt vom vorausgegangenen Befehl.
Hat da jemand eine Idee was mein Problem ist?
lg und Danke
Moderiert von
Christian S.: C#-Tags hinzugefügt