Hello, CAN!
Let's start with a simple example.
#include <stdio.h>
void main(void)
{
if (hnd < 0) {
char msg[64];
fprintf(stderr, "canOpenChannel failed (%s)\n", msg);
exit(1);
}
}
What does it do?
- The CANlib library is initialized by a call to canInitializeLibrary().
- A channel to a CAN circuit is opened. In this case we open channel 0 which should be the first channel on the CAN interface. canOPEN_EXCLUSIVE means we don't want to share this channel with any other currently executing program.
- The CAN bus bit rate is set 250 kBit/s, using a set of predefined bus parameters.
- The CAN bus driver type is set.
- The CAN chip is activated.
- A message with (11-bit) CAN id = 123, length 6 and contents (decimal) 72, 69, 76, 76, 79, 33 is transmitted.
- Wait until the message is sent or at most 500 ms.
- Inactivate the CAN chip.
- Close the channel.
What does it not do? Almost all error checking is omitted for brevity, see Error checking.
Error checking
The CANlib API consists exclusively of functions. Most of the functions return a status code of type canStatus, which is a negative number if the call failed, see canERR_xxx, and canOK (zero) if the call succeeded.
To get a textual description of an error code, use canGetErrorText()
Example. Error checking of canStatus and using canGetErrorText() to print a textual message.
static void checkStatus(
char*
id,
canStatus stat)
{
char buf[100];
buf[0] = '\0';
printf("%s: failed, stat=%d (%s)\n", id, (int)stat, buf);
exit(1);
}
}
checkStatus("canSetBusParams", stat);
CANlib Core API Calls
The following calls can be considered the CANlib "core" as they are essential for almost any program that uses the CAN bus.