CAN-BUS Bitrate aus C-Programm einstellen

  • Hallo,

    als stiller Leser dieses Forum habe ich jetzt eine Frage an die erfahrenen Programmierer auf die ich per Google etc keine Antwort gefunden habe:

    Ich habe an meinem RPi einen CAN-Bus Adapter mit einem MCP2515 angeschlossen und kann diesen auch via SocketCAN problemlos ansprechen.

    Jetzt habe ich aber die Notwendigkeit daß ich während des Programmlaufs die Bitrate auf dem CAN-Bus umschalten müßte. Von der Befehlszeile aus kann ich da ja mittels <IP LINK> ja problemlos machen. Aber wie ich das in C direkt machen kann ist mir immer noch ein Rätsel. Ich bin mir sicher das es eine LIB gibt mit der ich das machen kann.


    Gruß Andy

  • Hallo,

    Ich habe keine Erfahrung mit CAN, daher nur ein wenig gegoogelt.

    Mit PCAN scheint es einen freien Treiber zu geben, der ein /dev/PCANXX zur Verfügung stellt mit dem sich die Bitrate scheinbar ändern lässt.

    Ohne im Kernel zu basteln habe ich aber keine Methode gefunden. Die einfachste Lösung ist vielleicht das berühmt berüchtigte system().


    Ansonsten sieh den Post als Gelegenheit noch einmal auf der Startseite zu landen.

  • Servus AndyT1968,

    also wenn es mit einem tool funtioniert, dann wird das auch unterstützt.

    Du kannst jetzt mal schauen, ob das tool zum Umschalten evtl. Open Source ist, und da spicken oder Du suchst Dir die Beschreibung des Treibers raus, den Du benutzt und schaust nach, welche ioctl() Systamcalls mit welchen Parametern unterstützt werden.


    cu,

    -ds-

  • Ich musste noch ein wenig weiter suchen...

    Quelle: https://patchwork.kernel.org/patch/8019/



    An IOCTL habe ich auch schon gedacht, aber ums verrecken nichts gefunden. Du bist doch der C Guru, DS. Kann man wirklich alles im device über ioctl konfigurieren? Ich wüsste zwar nicht warum, kann es mir aber auch nicht richtig vorstellen. (Anfänger)

  • Hi El_Zetto,

    was alles über ioctl() konfigurierbar ist hängt vom Treiber ab.

    In der Regel ist aber so, dass Du mehr über ioctl() einstellen kannst, als über äquivalente andere systmcalls.

    Schönstes Beispiel für ioctl()-Aufrufe bis der Arzt kommt ist der tty-Treiber :) ...

    Es ist halt ein einfacher Weg Parameter zu setzen, auch für den Treiber-Entwickler, denn so ein ioctl() ist im Grunde nichts anderes als ein copy_from_user()/copy_to_user() von Daten (also Daten in den Kernel-Space transferieren bzw. aus dem Kernel- in den User-Space zu kopieren).

    Dass sich dahinter dann natürlich auch noch checks, locks, ... usw. verbergen, steht auf einem anderen Blatt.


    cu,

    -ds-

  • so, ich habe die Lösung gefunden:

    es gibt eine Library 'libsocketcan'. Diese stellt genau die Funktionen zur Verfügung welche mir den Zugriff auf Konfiguration und Status der CAN-Schnittstelle ermöglichen.


    Ich möchte nicht sagen wie viele Tage ich danach suchen mußte und es doch nur ein Zufallsfund dank Google war.



    Gruß Andy