3

I'm using SocketCAN on my system. Is there a way to set the CAN interface bitrate programmatically and not from the command line. An example would be helpful.

Thank you.

ilya1725
  • 4,496
  • 7
  • 43
  • 68

2 Answers2

2

Yes it is possible. Use NETLINK sockets, it is what ip uses.

Unfortunately, I do not know of any avaiable-easy example, but you could check the source code of ip.

Alternatively, you could use libsocketcan, which is a nice wrapper around netlink sockets for CAN.

Fusho
  • 1,469
  • 1
  • 10
  • 22
0

A little example for Qt (C++). Bitrate is set via QProcess. The CAN-Service must be stopped, then the bitrate can be configured, than CAN-Service must be started agein:

#include <QProcess>
#include <QString>

CO_set_bitrate(char const *can_device) //can_device for example "can0"
{
  QProcess set_bitrate;
  QStringList bitrate_args;
  QStringList stop_args;
  QStringList start_args;

  char const *can_bitrate = "500000"; //Set Bitrate

  stop_args.clear();
  stop_args<<"stop"<<can_device<<".service";

  start_args.clear();
  start_args<<"start"<<can_device<<".service";

  bitrate_args.clear();
  bitrate_args<<"link"<<"set"<<can_device<<"up"<<"type"<<"can"<<"bitrate"<<can_bitrate;

//Stop the CAN-Service
  set_bitrate.start("systemctl", stop_args, QIODevice::WriteOnly);
  set_bitrate.waitForFinished(-1);

//Set Bitrate
  set_bitrate.start( "ip", bitrate_args, QIODevice::WriteOnly); //Starts execution of command
  set_bitrate.waitForFinished(-1);

//Restart CAN-Service
  set_bitrate.start("systemctl", start_args, QIODevice::WriteOnly);
  set_bitrate.waitForFinished(-1);
  }
fblack23
  • 1
  • 1