Forum: PC-Programmierung Problem mit serieller Schnittstelle beim beschreiben


von ProblemFalke (Gast)


Lesenswert?

Hallo Forum,

ich versuche 2 Befehle über den USB-Port an einen µC zu übergeben.

Die Befehle sind richtig (per HTerm funktionieren diese, bzw. habe ich 
sie auch im µC-Quelltext überprüft), trotzdem funktioniert ein Befehl, 
beim anderen erhalte ich die Fehlermeldung "Invalid Command" vom µC...

Ich beschreibe wie folgt:
1
if(!WriteFile(hSerial, c_command1, sizeof(c_command1), &dwBytesWrite, NULL)) 
2
{ 
3
    cerr << "Error: Reading failure" << endl; 
4
}

die Befehle lauten:

(funktionierend):
1
START\r\n

(nicht funktionierend):
1
PARAM NR 5\r\n

per monitoring konnte ich auch herausfinden das die Zeichenketten auch 
versendet werden.

Ich bin momentan leicht verzweifelt, kann mir jemand helfen? Mir gehen 
die Ideen aus wo ich noch meinen Fehler suchen könnte... sizeof() habe 
ich überprüft; 8 und 13; dwBytesWrite ist ein DWORD Counter für die 
Anzahl der gesendeten Bytes.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

ProblemFalke schrieb:
> beim anderen erhalte ich die Fehlermeldung "Invalid Command" vom µC

Hast Du denn mit einem Terminalprogramm (putty, teraterm, hyperterminal 
o.ä.) überprüft, daß Dein Kommando ("PARAM NR 5") korrekt verarbeitet 
wird?

Da c_command1 ein char-Array zu sein scheint, solltest Du statt sizeof 
besser strlen verwenden; spätestens, wenn Du Deine Funktionalität in 
einer Funktion unterbringst, wird Dir sizeof sonst nur noch die Größe 
des übergebenen Pointers statt der erwarteten Stringlänge liefern ...

von ProblemFalke (Gast)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Hast Du denn mit einem Terminalprogramm (putty, teraterm, hyperterminal
> o.ä.) überprüft, daß Dein Kommando ("PARAM NR 5") korrekt verarbeitet
> wird?

ProblemFalke schrieb:
> Die Befehle sind richtig (per HTerm funktionieren diese...

Ich gehe stark davon aus. Aber trotzdem Danke.
Die c_commandX sind c-Arrays, werden aber direkt in der Schreibfunktion 
(also die umliegende) gebildet, momentan noch fest, am Ende wird dann 
eine Benutzereingabe (GUI) eingelesen, aber auch innerhalb der Funktion. 
Trotzdem ändere ich das, scheint besser zu sein...

Eventuell noch irgendein andere Idee? Kann es noch irgendwie am CR-LF 
liegen? Bei Start geht es aber auch... Es ist ja wirklich die gleiche 
Schreibmethode, nur dass das Kommando/der Befehl ein anderer ist...

von Georg (Gast)


Lesenswert?

ProblemFalke schrieb:
> (nicht funktionierend):PARAM NR 5\r\n

Bist du sicher, dass das überhaupt stimmt? Der Befehl besagt so wie er 
da steht, wähle Parameter Nr. 5 - und dann? Soll der Parameter auf einen 
bestimmten Wert gesetzt werden, aber wo steht der? Der Befehl macht so 
keinen Sinn, man sollte sowas erwarten wie "PARAM NR 5 = 42".

Georg

von ProblemFalke (Gast)


Lesenswert?

Georg schrieb:
> Bist du sicher, dass das überhaupt stimmt?

ProblemFalke schrieb:
> Die Befehle sind richtig (per HTerm funktionieren diese,
> bzw. habe ich sie auch im µC-Quelltext überprüft

Der Befehl sagt genaugenommen:
Parameter "Nummer" auf 5, oder um es nochmal in deiner Art zu schreiben 
Param Nr = 5

Das Problem konnte ich jetzt lösen. Die Zeichen "\r" und "\n" werden als 
jeweils "1" Zeichen gelesen, aber ich muss sie als 2 Zeichen übertragen.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

ProblemFalke schrieb:
> Das Problem konnte ich jetzt lösen. Die Zeichen "\r" und "\n" werden als
> jeweils "1" Zeichen gelesen, aber ich muss sie als 2 Zeichen übertragen.

Das halte ich für ... ziemlich unwahrscheinlich.

von ProblemFalke (Gast)


Lesenswert?

ich auch, aber auf jedenfall funktioniert das jetzt so...
Bessere Hypothesen, evtl. mit Erklärung, nehme ich aber gerne an ;-)

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

ProblemFalke schrieb:
> ich auch, aber auf jedenfall funktioniert das jetzt so...
> Bessere Hypothesen, evtl. mit Erklärung, nehme ich aber gerne an ;-)

Dann solltest du mal den Konkreten Code (geht/geht nicht) posten. Und 
mal verraten wie man 2 Zeichen "als eins" sendet, das wäre nämlich 
revolutionär da man damit die effektive Bandbreite verdoppeln könnte.

: Bearbeitet durch User
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.