1 /**************************************************************/
2 /* CAN system calls example */
3 /* Author: Michal Sojka, Czech Technical University in Prague */
4 /* License: Public domain */
5 /**************************************************************/
10 #include <linux/can.h>
14 #define MIN(a, b) ((a) < (b) ? (a) : (b))
16 #define STRINGIFY(val) #val
17 #define TOSTRING(val) STRINGIFY(val)
20 * Evaluate expression cmd and if its value is -1, print an error
21 * message with perror().
23 * @return Result of cmd evaluation
25 #define CHECK(cmd) ({ int ret = (cmd); if (ret == -1) { perror(#cmd " line " TOSTRING(__LINE__)); exit(1); }; ret; })
26 #define CHECKPTR(cmd) ({ void *ptr = (cmd); if (ptr == (void*)-1) { perror(#cmd " line " TOSTRING(__LINE__)); exit(1); }; ptr; })
28 char *candump_parse_args(int argc, char *argv[])
31 fprintf(stderr, "Usage: %s <CAN interface>\n", argv[0]);
37 void print_can_frame(const struct can_frame *cf)
41 printf("%#010x [%d]", cf->can_id, cf->can_dlc);
42 for (i = 0; i < cf->can_dlc; i++)
43 printf(" %02x", cf->data[i]);
47 void can_str2frame(const char *str, struct can_frame *cf)
50 unsigned char *d = cf->data;
52 "%x#%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%ms",
54 d+0, d+1, d+2, d+3, d+4, d+5, d+6, d+7, &extra);
56 fprintf(stderr, "Error parsing CAN frame '%s'\n", str);
60 fprintf(stderr, "Error: Extra input '%s'\n", extra);
63 cf->can_dlc = ret - 1;
66 char *cansend_parse_args(int argc, char *argv[], int *count, struct can_frame *cf_array, size_t max_count)
70 fprintf(stderr, "Usage: %s <CAN interface> <CAN frame>...\n", argv[0]);
71 fprintf(stderr, " CAN frame is ID#DATA, e.g. 123#4567\n");
75 for (i = 0; i < MIN(argc - 2, max_count); i++)
76 can_str2frame(argv[i + 2], &cf_array[i]);