can test code

tfl_can.c

#include "tfl_can.h"
//
int can_init( int* sock )
{
struct sockaddr_can addr;
struct ifreq ifr;
const char* ifrname = "can1";
// open socket
if ((*sock = socket(PF_CAN, SOCK_RAW, CAN_RAW)) < 0)
{
perror("Error open socket...\n");
return 1;
}
strcpy(ifr.ifr_name, ifrname);
// ioctl(*sock, SIOCGIFINDEX, &ifr);
ifr.ifr_ifindex = if_nametoindex(ifr.ifr_name);
// printf("%s \n", ifr.ifr_name);
if (!ifr.ifr_ifindex)
{
perror("if_nametoindex error...\n");
return 1;
}

memset(&addr, 0, sizeof(addr));
addr.can_family = AF_CAN;
addr.can_ifindex = ifr.ifr_ifindex;
setsockopt(*sock, SOL_CAN_RAW, CAN_RAW_FILTER, NULL, 0); //disable filter.
// bind socket
if (bind(*sock, (struct sockaddr *)&addr, sizeof(addr)) < 0)
{
perror("Error in socket bind...\n");
return 1;
}
return 0;
}
void can_tfl(int s, TFL* data)
{
char buf[5][8] = {0};
buf[0][7] = (data->total)<<2;
for(int i=0; i<5; i++)
{
buf[i][0] = ((data->type)<<4) + (data->color);
buf[i][1] = (data->xpos)>>4;
buf[i][2] = ((data->xpos)<<8) + ((data->level)<<2);
data++;
buf[i][4] = ((data->type)<<4) + (data->color);
buf[i][5] = (data->xpos)>>4;
buf[i][6] = ((data->xpos)<<8) + ((data->level)<<2);
buf[i][7] = buf[i][7] + (data->rlcnt);
if(i<4) data++;
cansend_tfl(s, i, buf[i]);
usleep(2000); // us
}
printf("**********can_tfl once*******\n");
return;
}
void cansend_tfl(int s, int i, char* buffer)
{
// send CAN frame
struct can_frame frame;
if(i==0) frame.can_id = 0x461;
else if(i==1) frame.can_id = 0x462;
else if(i==2) frame.can_id = 0x463;
else if(i==3) frame.can_id = 0x464;
else if(i==4) frame.can_id = 0x465;
frame.can_dlc = 8;
frame.data[0] = *buffer;
frame.data[1] = *(buffer+1);
frame.data[2] = *(buffer+2);
frame.data[3] = *(buffer+3);
frame.data[4] = *(buffer+4);
frame.data[5] = *(buffer+5);
frame.data[6] = *(buffer+6);
frame.data[7] = *(buffer+7);
printf("frame: %x %x %x %x %x %x %x %x\n", *buffer, *(buffer+1), *(buffer+2), *(buffer+3), *(buffer+4), *(buffer+5), *(buffer+6), *(buffer+7));
// int nbyte = write(s, &frame, sizeof(struct can_frame));
// printf("nbyte: %d, CAN_MTU: %d\n", nbyte, CAN_MTU);
if(write(s, &frame, sizeof(struct can_frame)) != CAN_MTU)
{
perror("write frame error.\n");
return;
}
return;
}

int main()
{
for (int k=0; k<100; k++)
{
TFL objs[10] = {{1, 1, 640, 3, 2, 0}, {3, 1, 456, 2, 2, 0}, {0}};
for(int i=0; i<10; i++) objs[i].rlcnt = 1;
TFL* data = objs;
int s;
can_init(&s);
can_tfl(s, data);
close(s);
printf("loop: %d\n", k);
}
}
int main_data()
{
int s;
can_init(&s);

struct can_frame frame;
frame.can_id = 0x461;
frame.can_dlc = 8;
printf("ID=%#x data length=%d\n", frame.can_id, frame.can_dlc);
/* prepare data for sending: 0x11,0x22...0x88 */
for (int i=0; i<8; i++)
{
frame.data[i] = ((i+1)<<4) | (i+1);
printf("%#x ", frame.data[i]);
}
printf("Sent out\n");
/* Sending data */
if(write(s, &frame, sizeof(frame)) < 0)
{
perror("Send failed");
return 1;
}
close(s);
return 0;
}
int main_init()
{
int s;
struct sockaddr_can addr;
struct ifreq ifr;
const char* ifrname = "can1";
// open socket
if ((s = socket(PF_CAN, SOCK_RAW, CAN_RAW)) < 0)
{
perror("Error open socket...\n");
return 1;
}
strcpy(ifr.ifr_name, ifrname);
// ioctl(*sock, SIOCGIFINDEX, &ifr);
ifr.ifr_ifindex = if_nametoindex(ifr.ifr_name);
printf("%s \n", ifr.ifr_name);
if (!ifr.ifr_ifindex)
{
perror("if_nametoindex error...\n");
return 1;
}

memset(&addr, 0, sizeof(addr));
addr.can_family = AF_CAN;
addr.can_ifindex = ifr.ifr_ifindex;
setsockopt(s, SOL_CAN_RAW, CAN_RAW_FILTER, NULL, 0); //disable filter.
// bind socket
if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0)
{
perror("Error in socket bind...\n");
return 1;
}

struct can_frame frame;
frame.can_id = 0x461;
frame.can_dlc = 8;
printf("ID=%#x data length=%d\n", frame.can_id, frame.can_dlc);
/* prepare data for sending: 0x11,0x22...0x88 */
for (int i=0; i<8; i++)
{
frame.data[i] = ((i+1)<<4) | (i+1);
printf("%#x ", frame.data[i]);
}
printf("Sent out\n");
/* Sending data */
if(write(s, &frame, sizeof(frame)) < 0)
{
perror("Send failed");
return 1;
}
close(s);
return 0;
}

View Code

tfl_can.h

#ifndef TFL_CAN_H
#define TFL_CAN_H
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <net/if.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <linux/can.h>
#include <linux/can/raw.h>

typedef struct{
unsigned int color; // 0-unknown, 1-green, 2-yellow, 3-red, 4-off;
unsigned int type; // 0-unknown, 1-round, 2-left, 3-right, 4-Uturn, 5-bicycle, 6-pedestrain;
unsigned int xpos; // 0-1280, image width;
unsigned int level; // 0-3, 0-lowest, 3-highest;
unsigned int total; // total num of object.
unsigned int rlcnt; // Rolling Count, 0<->3.
} TFL;

int can_init(int*);
void can_tfl(int s, TFL* data);
void cansend_tfl(int s, int i, char* buffer);
#endif

CMakeLists.txt

cmake_minimum_required(VERSION 3.3)
project(cantest LANGUAGES C)
set(CMAKE_BUILD_TYPE Release)

set(INCLUDE_DIRS include)
include_directories (${INCLUDE_DIRS})

set(LIBS_DIRS)
link_directories(${LIBS_DIRS})

set(LIBS)
link_libraries(${LIBS})

aux_source_directory(src SRC_DIRS)
add_executable(${PROJECT_NAME} ${SRC_DIRS})
target_link_libraries(${PROJECT_NAME} ${LIBS})
# install(TARGETS ${PROJECT_NAME} DESTINATION ${CMAKE_INSTALL_BINDIR})
# add_custom_target(uninstall "${CMAKE_COMMAND}" -P "${CMAKE_SOURCE_DIR}/cmake/make_uninstall.cmake")

 

 

参考

1. ​​解决C语言error: expected ‘;‘, ‘,‘ or ‘)‘ before ‘&‘ token​​;