Я работаю над простым проектом с использованием библиотеки SocketCAN для отправки некоторых сообщений по CAN. Но теперь я застрял с проблемой, которую я не могу объяснить сам … Когда я использую команду сокета write
в пользовательском классе происходит сбой с неверным аргументом (errno: 22 — EINVAL). Чтобы найти свою проблему, я обнародовал весь класс и использовал те же функции, что и в моем классе, в моем main
метод это работает …
Пользовательский класс (не работает):
void Can::SendFrame(const can_frame &canFrame) const
{
bcm_message request = CreateSingleNonCyclicFrameTransmissionRequest(canFrame);
int result = write(canSocket, &request, sizeof(request));
}
Основной (рабочий):
Can can;
bcm_message = can.CreateSingleNonCyclicFrameTransmissionRequest(canFrame);
int result = write(can.canSocket, &request, sizeof(request));
Я использую разъем BCM. Розетка подключена и работает нормально (из основного метода).
Есть идеи, в чем может быть проблема?
Редактировать:
Если я создам can_frame
в SendFrame()
write()
не подведет.
void Can::SendFrame(const can_frame &canFrame) const
{
can_frame testFrame;
testFrame.can_dlc = 1;
testFrame.can_id = 0x321;
testFrame.data[0] = 0xde;
auto request2 = CreateSingleNonCyclicFrameTransmissionRequest(testFrame);
int result2 = write(canSocket, &request2, sizeof(request2));
// as before:
bcm_message request = CreateSingleNonCyclicFrameTransmissionRequest(canFrame);
int result = write(canSocket, &request, sizeof(request));
}
Edit2:
Была разница в flags
поле созданных запросов. В request2
инициализируется с 0x01
и для request
с 0x7effb80
… не знаю, откуда это берется … но явно установить его 0x0
решил проблему
Задача ещё не решена.
Других решений пока нет …