CAN Abfrage von ASCII und Dezimalwerten

OP #2711632
Lesenswert?

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
Angehängte Dateien:
#2711729
Lesenswert?

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.
Gast #2711853
Lesenswert?

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...
OP #2711856
Lesenswert?

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
OP #2711857
Lesenswert?

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
#2711950
Lesenswert?

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.
Gast #2711992
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren