Forum: PC-Programmierung Terminalprogramm mit Visual C++ 2008


von Jens S. (jenser)


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

von Toni Holiday (Gast)


Lesenswert?

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)?

von Jens S. (jenser)


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.

von Toni Holiday (Gast)


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.

von Jens S. (jenser)


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.

von Der M. (steinadler)


Lesenswert?

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.

von Jens S. (jenser)


Lesenswert?

@Micha

this->serialPort1->Write("MM\r\n");

oder

this->serialPort1->Write("MM\n\r");

habe ich schon versucht. Jedoch auch ohne Erfolg.

von Der M. (steinadler)


Lesenswert?

Stimmt Baudrate und Parität??? Start, Stopp-Bits?

von Jens S. (jenser)


Lesenswert?

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
Noch kein Account? Hier anmelden.