Terminalprogramm mit Visual C++ 2008

OP #1819366
Lesenswert?

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");
}
OP #1819397
Lesenswert?

//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.
Gast #1819430
Lesenswert?

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.
OP #1819435
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren