libsockcanpp

    • Release
    • Open Source

      libsockcanpp

      Hallo zusammen,

      das Projekt ist bereits einige Jahre alt, aber dennoch glaube ich, dass der ein oder andere hier im Forum davon profitieren könnte.

      Vorab: Diese Bibliothek ist nicht und in keinster Weise für Windows gedacht!

      Bei dieser Bibliothek handelt es sich um eines meiner Linux-Projekte aus dem Embedded-Bereich, es wird bereits von hunderten Projekten und Firmen rund um die Welt verwendet.
      Darunter auch Automobilhersteller, Dronenhersteller und viele andere Robotikprojekte, die auf CAN als Übertragungsmedium setzen.

      Der (einfallsreiche) Name der Bibliothek ist libsockcanpp und ist ein Wrapper um die SocketCAN Funktionalität, die ursprünglich von VW in den Linux-Kernel implementiert wurde.
      Es bietet eine einfache und objektorientierte Schnittstelle, um in C++-Applikationen mittels CAN Daten zu übertragen und empfangen.

      Diese Bibliothek ist Thread-Safe und funktioniert über mehrere Sockets hinweg über ein oder mehrere CAN-Interfaces.

      Verwendete Programmiersprache(n) und IDE(s):
      C++11, VS Code, nano und vi wo nötig.

      Systemanforderungen:
      Linux mit SocketCAN aktiviert, C++11-Unterstützung

      Systemveränderungen:
      Diese Bibliothek nimmt keine systemweiten Einstellungen vor!

      Alle geöffneten Sockets sind rein im Applikationsnamensbereich (/proc/$(pidof myapp)/fd) und werden mit Beenden eurer Applikation (sofern ihr den Destructor des Objekts aufruft) wieder geschlossen.

      Download(s):
      Der Quellcode kann auf meiner GitHub-Seite eingesehen und heruntergeladen werden: github.com/SimonCahill/libsockcanpp

      Die gesamte Doku kann auf meiner Dokumentationsseite eingesehen werden, oder mittels Doxygen generiert werden.

      Lizenz/Weitergabe:
      Die Bibliothek ist open source und unter der Apache-2.0-Lizenz lizensiert.




      documentation.simonc.eu/docs/libsockcanpp/

      Verwendung der Bibliothek:

      Diese Bibliothek ist primär dafür gedacht, in CMake-Projekten eingebunden zu werden.

      Je nach Plattform und Toolchain/SDK, solltet ihr unbedingt darauf achten, die entsprechende Toolchain-File für CMake mitzugeben!

      Quellcode

      1. if (NOT TARGET sockcanpp)
      2. add_subdirectory(/path/to/libsockcanpprepo ${CMAKE_CURRENT_BUILD_DIR}/libsockcanpp)
      3. endif()
      4. # ...
      5. target_link_libraries(
      6. # ...
      7. sockcanpp
      8. )


      Initialisierung des Treibers:

      Die Bibliothek ist einfach gestaltet, wählt das gewünschte CAN-Interface, das zu verwendende Protokoll und ggf. eine Default-ID für zu sendende Nachrichten:

      C-Quellcode

      1. #include <CanDriver.hpp>
      2. using sockcanpp::CanDriver;
      3. int main() {
      4. CanDriver canDriver("can0", CAN_RAW[, 0xbad]);
      5. return 0;
      6. }


      Senden von CAN-Frames:

      C-Quellcode

      1. #include <CanDriver.hpp>
      2. using sockcanpp::CanDriver;
      3. using sockcanpp::CanId;
      4. using sockcanpp::CanMessage;
      5. void sendCanFrameExample() {
      6. CanDriver canDriver("can0", CAN_RAW[, 0xd00d]);
      7. CanMessage messageToSend(0 /*send with default ID*/, "8 bytes!" /* the data */);
      8. auto sentByteCount = canDriver.sendMessage(messageToSend[, false /* don't force extended ID */]);
      9. printf("Sent %d bytes via CAN!\n", sentByteCount);
      10. }
      11. void sendMultipleFramesExample() {
      12. CanDriver canDriver("can1", CAN_RAW[, 0 /* no default ID */]);
      13. queue<CanMessage> messageQueue = {
      14. CanMessage(0x269, "somedata"),
      15. Canmessage(0x1e9, "moredata")
      16. };
      17. auto sentByteCount = canDriver.sendMessageQueue(messageQueue[, milliseconds(20) /* delay between frames */[, false /* don't force extended ID */]]);
      18. printf("Sent %d bytes via CAN!\n", sentByteCount);
      19. }


      Empfangen von CAN-Frames:

      C-Quellcode

      1. #include <CanDriver.hpp>
      2. using sockcanpp::CanDriver;
      3. using sockcanpp::CanId;
      4. using sockcanpp::CanMessage;
      5. void receiveCanFramesExample() {
      6. CanDriver canDriver("can2", CAN_RAW[, 0 /* no default ID */]);
      7. if (canDriver.waitForMessages([milliseconds(3000) /* timeout */])) {
      8. // read a single message
      9. CanMessage receivedMessage = canDriver.readMessage();
      10. // read all available messages
      11. queue<CanMessage> receivedMessages = canDriver.readQueuedMessages();
      12. // handle CAN frames
      13. }
      14. }
      Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

      Meine Firma: Procyon Systems

      Selbstständiger Softwareentwickler & IT-Techniker.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()