www.mikrocontroller.net

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


Autor: Jens Sch (jenser)
Datum:

Bewertung
0 lesenswert
nicht 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");
}

Autor: Toni Holiday (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)?

Autor: Jens Sch (jenser)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Toni Holiday (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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....). 
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.

Autor: Jens Sch (jenser)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Der Micha (steinadler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Jens,

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

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

Jenachdem, was auf dem µController programmiert ist.

Autor: Jens Sch (jenser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Micha

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

oder

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

habe ich schon versucht. Jedoch auch ohne Erfolg.

Autor: Der Micha (steinadler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stimmt Baudrate und Parität??? Start, Stopp-Bits?

Autor: Jens Sch (jenser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, das stimmt alles.

Habe jetzt eine kleine Abfrage mit BytesToRead geschrieben. Ist nicht 
schön aber funktional ;) .

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.