Forum: Mikrocontroller und Digitale Elektronik CAN Abfrage von ASCII und Dezimalwerten


von Dominik E. (noventa)


Angehängte Dateien:

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

von Karl H. (kbuchegg)


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.

von Dosmo (Gast)


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...

von Dominik E. (noventa)


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

von Dominik E. (noventa)


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

von Karl H. (kbuchegg)


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.

von Dominik E. (noventa)


Lesenswert?

Danke.
Ok werde das mal so versuchen.

von Dosmo (Gast)


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.

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.