Linux-CANFD
Loading...
Searching...
No Matches
canfd.cpp
1#include "canfd.h"
2#include <cstring>
3#include <cstring>
4#include <cassert>
5
6#include <iostream>
7
8using namespace std;
15 cout<<"Initializing CANFD"<<endl;
16 strcpy(ifr.ifr_name, "can0");
17 //------------------set up socket-------------------------------------{
18 socket_fd = socket(PF_CAN, SOCK_RAW, CAN_RAW);
19 if (socket_fd < 0) {
20 perror("CANFD Socket creation failed");
21 exit(EXIT_FAILURE);
22 }
23
24 int canfd_enabled = 1;
25 if (setsockopt(socket_fd, SOL_CAN_RAW, CAN_RAW_FD_FRAMES, &canfd_enabled, sizeof(canfd_enabled)) < 0) {
26 perror("Setting CAN FD option failed");
27 exit(EXIT_FAILURE);
28 }
29
30 if (ioctl(socket_fd, SIOCGIFINDEX, &ifr) < 0) {
31 perror("ioctl failed");
32 exit(EXIT_FAILURE);
33 }
34
35 addr.can_family = AF_CAN;
36 addr.can_ifindex = ifr.ifr_ifindex;
37
38 if (bind(socket_fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
39 perror("Socket bind failed");
40 exit(EXIT_FAILURE);
41 }
42 cout<<"Socket setup complete"<<endl;
43 //------------------set up socket-------------------------------------}
44 //------------------set up filters------------------------------------{
45 struct can_filter rfilter[6];
46
47 for (size_t i = 0; i < 6; i++) {
48
49 rfilter[i].can_id = 0x00000000 | (i+1);
50 rfilter[i].can_mask = 0x000000ff;
51 }
52 setsockopt(socket_fd, SOL_CAN_RAW, CAN_RAW_FILTER, &rfilter, sizeof(rfilter));
53 cout<<"Filters setup complete"<<endl;
54 //------------------set up filters------------------------------------{
55}
60 close(socket_fd);
61 cout<<"Socket closed"<<endl;
62}
63
70void CANFD::fdRead(char* p_data){
71 struct canfd_frame frame;
72 int nbytes = read(socket_fd, &frame, sizeof(frame));
73
74 if (nbytes < 0) {
75 perror("CAN FD Raw socket read failed");
76 return;
77 }
78
79 if (nbytes < sizeof(frame)) {
80 perror("Read: Incomplete CAN FD frame");
81 return;
82 }
83
84 memcpy(p_data, frame.data, frame.len);
85
86 printf("CAN ID: %u\n", frame.can_id);
87 printf("Data length: %d\n", static_cast<int>(frame.len));
88 printf("Received frame data: ");
89 for (int i = 0; i < frame.len; ++i) {
90 printf("%02X ", frame.data[i]);
91 }
92 printf("\n");
93
94}
95
106void CANFD::fdWrite(unsigned int can_id_standard, unsigned int flags, char* p_data, unsigned int length_data){
107 struct canfd_frame frame;
108
109
110 frame.can_id = CAN_EFF_FLAG | can_id_standard;
111 frame.flags = flags;
112 memcpy(frame.data, p_data, length_data);
113 frame.len = length_data;
114
115 int nbytes = write(socket_fd, &frame, sizeof(frame));
116
117 if (nbytes < 0) {
118 perror("CAN FD Raw socket write failed");
119 return;
120 }
121
122 if (nbytes < sizeof(frame)) {
123 perror("Write: Incomplete CAN FD frame");
124 }
125
126
127}
128
CANFD()
构造函数(配置socket(默认为“can0”)、配置fliters(filter配置直接在源码中更改))
Definition canfd.cpp:14
~CANFD()
析构函数(销毁CANFD句柄)
Definition canfd.cpp:59
void fdWrite(unsigned int can_id_standard, unsigned int flags, char *p_data, unsigned int length_data)
CANFD发送数据。
Definition canfd.cpp:106
void fdRead(char *p_data)
读取CANFD收到的数据。
Definition canfd.cpp:70