Hallo zusammen Ich muss mit einem bestehenden Programmteil CAN Meldungen verarbeiten, die normaerweise als String reinkommen und somit ein \n als Endung haben. Diese Meldungen werden alle korrekt verabeitet (siehe angehängtes Programm) Jetzt muss ich zusätzlich einen Befehl mit dezimalwerten verarbeiten. Dieser sieht folgendermassen aus: #i und danach kommen 6 Bytes, die je einen Wert von 0 bis 255 beinhalten können. Das Problem dabei habe ich jetzt, dass ein Wert von z.Bsp. 32 oder 0 nicht richtig an meine Funktion geschickt wird, bzw. gar nicht geschickt wird. In der while Schlaufe habe ich eine Abfrage ob der Wert Alphanumerisch ist oder nicht, ist er bei 0 sicher nicht. Somit habe ich diese Abfrage mal auskommentiert und immer auf true gesetzt, aber es funktioniert trotzdem nicht: if (isalnum((INT8) rx_char) || rx_char == '/' || rx_char == '#') Wo mache ich den Überlegungsfehler bzw. was muss ich ändern, damit ich die Werte nachj dem #i Befehl verarbeiten kann? Funktioniert es, wenn ich nach einem #i zum Beispiel warte bis der Byte counter (can_rx_byte_cnt) auf 8 steht und danach den Nullterminator (\0) einfüge? Oder wie muss man das korrekt lösen? Danke und Gruss
Dominik Eugster schrieb: > die normaerweise als String reinkommen und somit ein \n als Endung ****** > haben. Diese Meldungen werden alle korrekt verabeitet (siehe angehängtes > Programm) > > Jetzt muss ich zusätzlich einen Befehl mit dezimalwerten verarbeiten. > Dieser sieht folgendermassen aus: > #i und danach kommen 6 Bytes, die je einen Wert von 0 bis 255 beinhalten > können. Damit ist deine Aussage von oben gestorben. Du hast es eben NICHT mit Strings zu tun. Zumindest dieser Teil ist kein String und kann daher auch nicht so behandelt werden.
Ich hab das Problem nicht ganz kapiert, aber soweit ich es verstehe, bekommst Du vom CAN 8 binäre Bytes, die Du in einen String umwandeln mußt, um diese weiterzuverarbeiten. Du mußt also alle 6 Datenbytes von Binärdarstellung in Ascii-Darstellung umwandeln. Das ging z.B. mit
1 | sprintf(zielstring, "#i%i%i%i%i%i%i\n", candaten[2], candaten[3], candaten[4], candaten[5], candaten[6], candaten[7]); |
Korrekte sprintf-Syntax ohne Gewähr, hab's gerade nicht im Kopf...
Hallo Ja die Daten kommen dann nicht als String rein, das stimmt. Aber wenn das erste Byte ein '#' ist, und danach gewartet wird bis der Byte-Counter auf 8 steht, dann sollte es funktionieren oder sehe ich das falsch? Wie würdest Du dieses #i abfragen? Ich habe immer eine fixe Grösse, das heisst #i danach 4 Bytes (glaube ich, oder auch 6, aber kommt aufs gleiche raus) Gruss
Dosmo schrieb: > Ich hab das Problem nicht ganz kapiert, aber soweit ich es verstehe, > bekommst Du vom CAN 8 binäre Bytes, die Du in einen String umwandeln > mußt, um diese weiterzuverarbeiten. > > Du mußt also alle 6 Datenbytes von Binärdarstellung in Ascii-Darstellung > umwandeln. > Das ging z.B. mit >
1 | > sprintf(zielstring, "#i%i%i%i%i%i%i\n", candaten[2], candaten[3], |
2 | > candaten[4], candaten[5], candaten[6], candaten[7]); |
3 | >
|
> Korrekte sprintf-Syntax ohne Gewähr, hab's gerade nicht im Kopf...
Genau das muss ich machen.
Das heisst zuerst alle 6 Bytes abwarten und danach mit sprintf umwandeln
und an die nächste Funktion senden. Ich hoffe das geht so einfach wie
sichs anhört :-) Danke
Dominik Eugster schrieb: > Dosmo schrieb: >> Ich hab das Problem nicht ganz kapiert, aber soweit ich es verstehe, >> bekommst Du vom CAN 8 binäre Bytes, die Du in einen String umwandeln >> mußt, um diese weiterzuverarbeiten. >> >> Du mußt also alle 6 Datenbytes von Binärdarstellung in Ascii-Darstellung >> umwandeln. >> Das ging z.B. mit >>
1 | >> sprintf(zielstring, "#i%i%i%i%i%i%i\n", candaten[2], candaten[3], |
2 | >> candaten[4], candaten[5], candaten[6], candaten[7]); |
3 | >>
|
>> Korrekte sprintf-Syntax ohne Gewähr, hab's gerade nicht im Kopf... > > Genau das muss ich machen. > Das heisst zuerst alle 6 Bytes abwarten und danach mit sprintf umwandeln > und an die nächste Funktion senden. Ich hoffe das geht so einfach wie > sichs anhört :-) Danke Mach aber zwischen die einzelnen ASCII Zahlen ein Trennzeichen rein. Denn sonst steht dein Empfänger wieder vor dem Problem, ob denn nun #1235255 als 12 35 255 oder doch als 123 5 255 oder vielleicht als 1 23 52 55 oder 1 235 2 55 oder ... zu lesen sei.
Dominik Eugster schrieb: > Danke. > Ok werde das mal so versuchen. Eigentlich wär es besser, wenn Du wüßtest, in welchem Format der String vorliegen muß, damit alles korrekt funktioniert. Und wenn Du wüßtest, in welchem Format die CAN-Daten reinkommen. Könnte ja z.B. sein, daß die CAN-Daten BCD-codiert sind und jeweils zwei 10er-Stellen enthalten.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.