sendkurtmsgtest.c
Go to the documentation of this file.
00001 // ./cansend can0 001#0000640064
00002 
00003 #include <stdio.h>
00004 #include <stdlib.h>
00005 #include <string.h>
00006 #include <unistd.h>
00007 
00008 #include <net/if.h>
00009 #include <sys/ioctl.h>
00010 
00011 #include <linux/can.h>
00012 #include <linux/can/raw.h>
00013 
00014 #define CANINTERFACE "can0"
00015 
00016 int main (void) {
00017   int left_pwm = 100;
00018   char left_dir = 0;
00019   char left_brake = 0;
00020   int right_pwm = 100;
00021   char right_dir = 0;
00022   char right_brake = 0;
00023 
00024   char left_dir_brake =  (left_dir << 1) + left_brake;
00025   char right_dir_brake = (right_dir << 1) + right_brake;
00026 
00027   int i;
00028 
00029 
00030   int s; /* can raw socket */ 
00031   int nbytes;
00032   struct sockaddr_can addr;
00033   struct can_frame frame;
00034   struct ifreq ifr;
00035 
00036   frame.can_id = 1;
00037   frame.can_dlc = 8;
00038 
00039   frame.data[0] = 0 >> 8;
00040   frame.data[1] = 0;
00041   frame.data[2] = (left_dir_brake);
00042   frame.data[3] = (left_pwm >> 8);
00043   frame.data[4] = (left_pwm);
00044   frame.data[5] = (right_dir_brake);
00045   frame.data[6] = (right_pwm >> 8);
00046   frame.data[7] = (right_pwm);
00047 
00048   printf("%s ", CANINTERFACE);
00049   printf("%X#", frame.can_id);
00050 
00051   for (i = 0; i < 8; i++) {
00052     printf("%X", frame.data[i]);
00053   }
00054 
00055   printf("\n");
00056 
00057 
00058   /* open socket */
00059   if ((s = socket(PF_CAN, SOCK_RAW, CAN_RAW)) < 0) {
00060     perror("socket");
00061     return 1;
00062   }
00063 
00064   addr.can_family = AF_CAN;
00065 
00066   strcpy(ifr.ifr_name, CANINTERFACE);
00067   if (ioctl(s, SIOCGIFINDEX, &ifr) < 0) {
00068     perror("SIOCGIFINDEX");
00069     return 1;
00070   }
00071   addr.can_ifindex = ifr.ifr_ifindex;
00072 
00073   /* disable default receive filter on this RAW socket */
00074   /* This is obsolete as we do not read from the socket at all, but for */
00075   /* this reason we can remove the receive list in the Kernel to save a */
00076   /* little (really a very little!) CPU usage.                          */
00077   setsockopt(s, SOL_CAN_RAW, CAN_RAW_FILTER, NULL, 0);
00078 
00079   if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
00080     perror("bind");
00081     return 1;
00082   }
00083 
00084   /* send frame */
00085   if ((nbytes = write(s, &frame, sizeof(frame))) != sizeof(frame)) {
00086     perror("write");
00087     return 1;
00088   }
00089 
00090   //fprint_long_canframe(stdout, &frame, "\n", 0);
00091   close(s);
00092   return 0;
00093 }


kurt_base
Author(s): Jochen Sprickerhof
autogenerated on Thu Aug 27 2015 13:44:43