Hallo Allerseits,
ich habe erfolgreich das MCP2515 Interface ans laufen bekommen. Ich kann Daten senden und empfangen.
Ich habe can-utils installiert und möchte auch auf dieser Library, in der Programmiersprache C/C++ arbeiten. Ich möchte kein Python verwenden.
Ich habe folgendes vor.
Ich möchte lediglich im Terminal eine Ausgabe des "Ladedrucks" meines Fahrzeugs.
Ich brauche eine komplette c-Datei inkl. makefile, die ich eventuell nur etwas bearbeiten muss.
Vielleicht hat der ein oder andere das selbe schonmal gemacht und kann mir helfen.
Ich habe meine 2 Drähtchen, der Raspberry empfängt Daten.
Ich möchte eine ID filtern und das 5te Byte auswerten.
Quelle Wireshark:
ID= "0x00000210"
Data (8Byte) = "64 00 00 00 00 00 00 00"
Byte Nr.5 (rot markiert), ergibt den Ladedruck nach folgendem Maßstab:
-100 -> (0 = -1bar 255 = 1,5 bar)
Der nachfolgende Code ist nur ein Bespiel wie man Daten sendet, nicht wie man mit einem Filter empfängt.
Zum Senden, habe ich unzählige Infos bekommen, aber was das Empfangen und Auswerten angeht, naja ... nichts was den Raspberry angeht.
Die Quelle ist mir leider nicht bekannt, aber so in etwa soll der Code später aussehen, mit dem Unterscheid, dass ich eine ID empfange und mit dem 5ten Byte des Frames, den Ladedruck ausgebe.
Ich muss um Entschuldigung bitten, ich bin was Netzwerke angeht einfach total überfordert.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <net/if.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <linux/can.h>
#include <linux/can/raw.h>
int
main(void)
{
int s;
int nbytes;
struct sockaddr_can addr;
struct can_frame frame;
struct ifreq ifr;
const char *ifname = "vcan0";
if((s = socket(PF_CAN, SOCK_RAW, CAN_RAW)) < 0) {
perror("Error while opening socket");
return -1;
}
strcpy(ifr.ifr_name, ifname);
ioctl(s, SIOCGIFINDEX, &ifr);
addr.can_family = AF_CAN;
addr.can_ifindex = ifr.ifr_ifindex;
printf("%s at index %d\n", ifname, ifr.ifr_ifindex);
frame.can_id = 00000310;
frame.can_dlc = 2;
frame.data[0] = 0x11;
frame.data[1] = 0x22;
if(bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
perror("Error in socket bind");
return -2;
}
nbytes = write(s, &frame, sizeof(struct can_frame));
printf("Wrote %d bytes\n", nbytes);
return 0;
}
Alles anzeigen
Dazu die makefile
all : cantest
clean :
rm *.o cantest
cantest : cantest.o
gcc -o cantest cantest.o
cantest.o : cantest.c
gcc -c cantest.c
Alles anzeigen
Ich möchte kein Befehl wie candump can0 blablabla, sondern ein eigenes C-Progrämmchen, welches einfach nur in Echtzeit oder paar ms Latenz, den Ladedruck ausgibt.
Bitte seid so nett und verlinkt mir keine Doku von canutils o.ä.. Damit kann ich nicht arbeiten bzw. fällt es mir schwer es zu veretehen und umzusetzen.
ACHTUNG MIMIMI:
Ich möchte auch keine Tipps bzgl. der Hardware (Bsp. "Kauf dir einen Arduino, der Raspi ist zu oversized..., Kauf dir nen ELM327, kauf dir USB wasweißich").
Ich habe mich so geärgert, dass viele Leute in anderen Foren vom Thema extremst abweichen und/oder ihren unbrauchbaren Senf dazugeben.
Ich denke ihr wisst was ich meine, also bitte ich um euer Verständnis. Bitte bleibt beim Thema. :heart:
2 Tage habe ich das Internet durchsucht und nichts brauchbares gefunden.
Und wenn ich was gefunden habe, sind da Leute, die nicht nachvollziehbare Source-Code-Schnipsel posten, wo man einfach nicht mehr weiß, "wie oder was passiert jetzt da und wo ist die library dazu".
MIMIMI Ende
Vielen Dank im Vorraus für eure Hilfe