Кросс-компиляция проекта CAN с использованием CMAKE и цепочки инструментов arm, но возникают проблемы с поиском AF_CAN PF_CAN

Я кросс-компиляции с использованием CMAKE для встроенного устройства arm, и у меня возникли некоторые проблемы с определением PF_CAN и AF_CAN. Мне посоветовали использовать

sys/socket.h

но он не содержит определений и не может сказать, указывает ли он на него косвенно.

Это моя текущая программа (супер простая)

/* A simple SocketCAN example */

#include <cstdlib>
#include <stdio.h>
#include <cstring>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/stat.h>

#include <arpa/inet.h>
#include <netdb.h>
#include <netinet/in.h>
#include <unistd.h>
#include <pthread.h>
#include <assert.h>
#include <errno.h>
#include <iostream>

#include <sys/socket.h>  // i tried linux/socket.h and get some other errors, so I am confused.
#include <pthread.h>
#include <net/if.h>
#include <string.h>
#include <net/if.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <assert.h>
#include <linux/can.h>
#include <linux/can/raw.h>

int soc;
int read_can_port;

int open_port(const char *port)
{
ifreq ifr;
sockaddr_can addr;
/* open socket */
soc = socket(PF_CAN, SOCK_RAW, CAN_RAW);
if(soc < 0)
{
return (-1);
}
addr.can_family = AF_CAN;
strcpy(ifr.ifr_name, port);
if (ioctl(soc, SIOCGIFINDEX, &ifr) < 0)
{
return (-1);
}
addr.can_ifindex = ifr.ifr_ifindex;
fcntl(soc, F_SETFL, O_NONBLOCK);
if (bind(soc, (struct sockaddr *)&addr, sizeof(addr)) < 0)
{
return (-1);
}
return 0;
}
int send_port(struct can_frame *frame)
{
int retval;
retval = write(soc, frame, sizeof(struct can_frame));
if (retval != sizeof(struct can_frame))
{
return (-1);
}
else
{
return (0);
}
}
/* this is just an example, run in a thread */
void read_port()
{
struct can_frame frame_rd;
int recvbytes = 0;
read_can_port = 1;
while(read_can_port)
{
struct timeval timeout = {1, 0};
fd_set readSet;
FD_ZERO(&readSet);
FD_SET(soc, &readSet);
if (select((soc + 1), &readSet, NULL, NULL, &timeout) >= 0)
{
if (!read_can_port)
{
break;
}
if (FD_ISSET(soc, &readSet))
{
recvbytes = read(soc, &frame_rd, sizeof(struct can_frame));
if(recvbytes)
{
printf("dlc = %d, data = %s\n",
frame_rd.can_dlc,frame_rd.data);
}
}
}
}
}
int close_port()
{
close(soc);
return 0;
}
int main(void)
{
std::cout << "Hello World! " << std::endl;

open_port("can0”");
read_port();
return 0;
}

Это мой вывод, когда я запускаю make:

HelloWorld.cpp: 45: ошибка: «PF_CAN» не был объявлен в этой области
HelloWorld.cpp: 45: ошибка: «PF_CAN» не был объявлен в этой области

0

Решение

Решение было добавить

#ifndef AF_CAN
#define AF_CAN 29
#endif

Это позволило построить проект без ошибок. Кроме того, проект запускался на целевом устройстве, и он работал нормально.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]