Hallo, ich bin gerade dabei ein kleines kundenspezifisches Terminal-Programm zu schreiben. Dieses Programm soll mit Hilfe einiger Buttons Befehle via RS232 zu einem µC schicken und die Antworten anzeigen. So weit so gut! Das empfangen der Anworten klappt sehr gut und auch das senden funktioniert "FAST" problemlos. Nun zu meinem Problem: Um eine Antwort des Controllers zu erhalten, muss ich den Befehl 8mal schicken. Ich habe schon alles versucht aber irgendwie find ich den Fehler nicht. Verwende ich ein bestehendes Terminal-Programm (HTERM) bekomme ich die Antwort auch nach einmaliger Befehlseingabe! Habe die Befehle, welche mein Terminal schickt, mit HTERM ausgewertet und es wird wirklich jedesmal ein Befehl gesendet. Habt ihr sowas schon mal erlebt? Hier findet ihr einen kleinen Programmausschnitt: //for(int i=0;i<8;i++){this->serialPort1->Write("MM\r");Sleep(20);} this->serialPort1->Write("MM\r"); Sleep(20); DateTime zeit=DateTime::Now; try { this->serialPort1->ReadTimeout=100; this->richTextBox1->AppendText(zeit+"\t"+"MM"+"\t"+Convert::ToString (this->serialPort1->ReadExisting())+"\n" ); } catch(TimeoutException^ ex) { this->richTextBox1->AppendText("No MM Answer!\r"); }
Jens Sch schrieb: > //for(int i=0;i<8;i++){this->serialPort1->Write("MM\r");Sleep(20);} Warum ist die Zeile auskommentiert, wenn du 8x senden sollst? Benoetigt der uc vielleicht zusaetzlich zum Carriage Return (\r) ein Line Feed (\n)?
//for(int i=0;i<8;i++){this->serialPort1->Write("MM\r");Sleep(20);} Wenn ich MM\r 8mal senden will, ist diese Zeile nicht ausdokumentiert. Jedoch halte ich diese Lösung für sehr unsauber und suche deshalb nach Alternativen. Irgendwie muss es ja auch mit einmal senden klappen. Und \n funktioniert leider auch nicht. Alles schon versucht.
Es könnte sich auch um ein Timing-Problem handeln. Laut MSDN-Net Referenz verwendet ReadExisting() kein Timeout (siehe http://msdn.microsoft.com/de-de/library/system.io.ports.serialport.readexisting(v=VS.80).aspx). Daher ist der Eintrag ReadTimeout = 100 meiner Meinung nach sowieso ueberflüssig. Vielleicht solltest du den Sleep-Wert nach dem Senden noch einmal leicht erhoehen. Eine andere Möglichkeit wäre, erst über die Eigenschaft BytesToRead der SerialPort-Klasse die Anzahl der momentan empfangenen Bytes abzurufen und dann erst die Daten abholen.
Der Eintrag "ReadTimeout" ist ein Überbleibsel meiner ganzen Versuche und ist hier wirklich nutzlos. Und den Sleep-Wert habe ich auch schon mehrfach verändert, bisher hat dies jedoch keine Wirkung gezeigt. Jedoch die Idee mit dem ByteToRead ist gut. Werde ich gleich mal ausprobieren. Danke.
Hallo Jens, schreib doch mal
1 | this->serialPort1->Write("MM\r\n"); |
oder
1 | this->serialPort1->Write("MM\n\r"); |
Jenachdem, was auf dem µController programmiert ist.
@Micha this->serialPort1->Write("MM\r\n"); oder this->serialPort1->Write("MM\n\r"); habe ich schon versucht. Jedoch auch ohne Erfolg.
Ja, das stimmt alles. Habe jetzt eine kleine Abfrage mit BytesToRead geschrieben. Ist nicht schön aber funktional ;) .
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.