Hat sich erstmal erledigt, habs hinbekommen
Druckbare Version
Hat sich erstmal erledigt, habs hinbekommen
So ich hab jetzt doch ein Problem:
ich verwende folgenden Code um Daten von der seriellen zu empfangen:
Da liest er solange Zeichen ein bis "\n" kommt.Code:void usart_gets( char* Buffer, uint8_t MaxLen )
{
uint8_t NextChar;
uint8_t StringLen = 0;
NextChar = usart_getc(); // Warte auf und empfange das nächste Zeichen
// Sammle solange Zeichen, bis:
// * entweder das String Ende Zeichen kam
// * oder das aufnehmende Array voll ist
while( NextChar != '\n' && StringLen < MaxLen - 1 )
{
*Buffer++ = NextChar;
StringLen++;
NextChar = usart_getc();
}
// Noch ein '\0' anhängen um einen Standard
// C-String daraus zu machen
*Buffer = '\0';
}
Die Steuerung die von der ich Daten empfange sendet aber nicht ein solches Endzeichen dort hört der Datensatz einfach mit der Checksumme ihrer Daten auf. Wie kann ich das jetzt gestalten, das er mir den Datensatz einliest und ihn mir in meiner Variable daten zurück gibt.
Jetzt wartet er ja vergeblich bis mal zufällig so ein Steuerzeichen kommt
Ich habe mich geirrt, die Steuerung sendet die Daten ohne irgendeinen abschluss, hört nach einen Datensatz einfach auf und will dann die Antwort haben.
Wie bring ich nun meiner Routine bei das der Datensatz zu Ende ist?
Vielleicht durch eine definierte Wartezeit? Wie schreib ich das?
Moin!
Wenn die Datensätze immer gleich lang sind, kannst Du evtl. enfach mitzählen, ansonsten leiße sich das Ganze evtl. über ein Timeout lösen, wenn die Lücke zwischen zwei Datensätzen lang genug ist.
MfG
Volker
Kannst du mir sagen wie ich das mit den Timeouts hinbekomme? Die Datensätze sind nämlich unterschiedlich lang.
Hallo,
weisst Du wie die Datensätze aufgebaut sind, also was die Daten bedruten ?
Evtl. ist darin dann die länge enthalten.
Das muss aber nicht unbedingt heissen, das die genaue länge drin vorkommt, sondern das der Empfänger einfach wissen muss wann was wielange sein sollte.
zB wenn das 1.Byte einen Befehl darstellt, ist damit schon festgelegt wieviel danach noch zu kommen hat.
:-k
HI
das selbe problem hatte ich auch mit HTerm. Ich hab dann einfach die Zeichen gezählt aber du kannst die strings einfach z.B. immer mit ";" beenden
dann schreibst du statt:
while( NextChar != '\n' && StringLen < MaxLen - 1 )
einfach:
while( NextChar != ';' && StringLen < MaxLen - 1 )
KR-500
In Hterm kann ich ja einstellen das er die Zeichenkette mit \n abschließt. Aber das sollte nur zum probieren sein ob die Routine so erstmal funktioniert. Aber ich kann der Steuerungnicht sagen das sie da ein zeichen dranpacken soll.
Also ich weis was die Zeichen bedeuten aber ne Checksumme kann ich da nicht finden, am besten also über nen Timeout aber wie geht das?
Hier mal ein Auszug aus den Daten:
Senden:4d 41 01 01 00 90 MA...
Empfangen: e9 4d 41 0c 49 00 1c 07 2b 5a 75 73 74 61 6e 64 éMA.I...+Zustand