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
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>
> 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>>
>> 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.
Eine eigene Frage?
Dieser Thread ist über 14 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.