Получение и отправка сообщения CAN J1939 в Linux на CLinux

Ответить Пред. темаСлед. тема
Anonymous
 Получение и отправка сообщения CAN J1939 в Linux на C

Сообщение Anonymous »

Я пытаюсь открыть SocketCAN J1939 и получать и отправлять сообщения J1939. Меня очень смущает тип «sockaddr_can». Эта структура имеет j1939.addr, j1939.pgn, j1939.name и т. д. Когда я получаю сообщение с

Код: Выделить всё

recvfrom(s, &lCANFrame.data, sizeof(lCANFrame.data), 0x0, (struct sockaddr*)&j1939_addr, &recv_data_len)
где sockaddr_can j1939_addr; адрес отправителя находится в j1939_addr.can_addr.j1939.addr, а PGN полученного сообщения находится в j1939_addr.can_addr.j1939.pgn< /код>. Однако я назначил этим значениям мой адрес SRC и ИМЯ, как показано ниже, при инициализации сокета.

Код: Выделить всё

    // J1939 CAN Socket
j1939_addr.can_family = AF_CAN;
j1939_addr.can_ifindex = ifr.ifr_ifindex;
j1939_addr.can_addr.j1939.name = J1939_NAME;     //J1939 Name
j1939_addr.can_addr.j1939.addr = CAN_SRC_ADDR;   //J1939: this is the SRC address of this device transmitting
//j1939_addr.can_addr.j1939.addr = J1939_IDLE_ADDR;   //J1939: this is the SRC address of this device transmitting
j1939_addr.can_addr.j1939.pgn =  J1939_NO_PGN;        //This is a filter for receive function. This will only recieve PGN that is mentioned
Итак, когда сообщение получено, ADDR и PGN перезаписываются полученным сообщением. В этом случае как мне сравнить мое ИМЯ с полученным ИМЯ и обновить мой адрес, если это конфликт (для запроса адреса).
Заботится ли ядро ​​о запросе адреса?
А также, как мне отправить сообщение. Ниже не работает. Подскажите пожалуйста, что я делаю не так?

Код: Выделить всё

send_response = sendto(s, &lCANFrame.data[1], 1, 0, (const struct sockaddr*)&j1939_addr, sizeof(j1939_addr)); //Send OUT CAN data to the interface    //Send one byte CAN message OUT
Я попробовал send() и write(), но все равно не могу отправить сообщение. Для CAN_RAW все работает нормально. Как только я меняю протокол на J1939, он не работает. Можете ли вы дать мне пример кода C. Вот моя инициализация:

Код: Выделить всё

   s = socket(PF_CAN, SOCK_DGRAM, CAN_J1939); //Open J1939 socket
strcpy(ifr.ifr_name, can_int_name); //can_int_name is the can interface name "vcan0", can0 etc.
ioctl(s, SIOCGIFINDEX, &ifr); //Retreive the index to the CAN interface
// J1939 CAN Socket
j1939_addr.can_family = AF_CAN;
j1939_addr.can_ifindex = ifr.ifr_ifindex;
j1939_addr.can_addr.j1939.name = J1939_NAME;     //J1939 Name
j1939_addr.can_addr.j1939.addr = CAN_SRC_ADDR;   //J1939: this is the SRC address of this device transmitting
j1939_addr.can_addr.j1939.pgn =  J1939_NO_PGN;   //This is a filter for receive function. This will only recieve PGN that is mentioned

if(bind(s, (struct sockaddr*)&j1939_addr, sizeof(j1939_addr)))      // Check to make sure Socket Binding is successful
{
perror("Error in Binding Socket");
}
Спасибо

Подробнее здесь: https://stackoverflow.com/questions/787 ... linux-in-c
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Экспортируйте определенные сообщения CAN из файла MF4 в файл ASC с помощью asammdf.
    Anonymous » » в форуме Python
    0 Ответы
    43 Просмотры
    Последнее сообщение Anonymous
  • Python-can bus.recv пропускает некоторые сообщения
    Anonymous » » в форуме Python
    0 Ответы
    44 Просмотры
    Последнее сообщение Anonymous
  • Проблема с Linux Проблема с Linux Проблема с Linux Проблема с Linux 4556729452321379 [закрыто]
    Anonymous » » в форуме Linux
    0 Ответы
    115 Просмотры
    Последнее сообщение Anonymous
  • Проблема с настройкой прослушивателя Python-Can
    Anonymous » » в форуме Python
    0 Ответы
    51 Просмотры
    Последнее сообщение Anonymous
  • Можно ли принудительно промыть разъем CAN-шины
    Гость » » в форуме C++
    0 Ответы
    27 Просмотры
    Последнее сообщение Гость

Вернуться в «Linux»