Отправка сообщений с разными идентификаторами на шину pcan can с использованием python can - PullRequest
0 голосов
/ 11 мая 2019

Моя программа отправляет почти 50 сообщений с разными идентификаторами на шину pcan. И затем непрерывно повторяется, начиная с новых данных для первого идентификатора.

Мне удалось инициализировать и отправить сообщение с одним идентификатором, но я не могу отправить другой идентификатор на шине. Я анализирую сигнал шины с помощью осциллографа, и поэтому я могу видеть, какие сообщения находятся на шине.

Это часть кода, показывающая, как я пытаюсь отправить 2 последовательных сообщения по шине, но он отправляет только сообщение id = 100, а не следующие. Для этого я импортирую только библиотеку python-can.

        for i in range(self.n_param):
            if self.headers[i] == 'StoreNo':  # ID 100 byte size = 3
                to_can_msg = []
                byte_size = 3
                hex_data = '0x{0:0{1}X}'.format(int(self.row_data[i], 10), byte_size * 2)
                to_can_msg = [int(hex_data[2:4], 16), int(hex_data[5:6], 16), int(hex_data[7:8], 16)]
                bus_send.send(Message(arbitration_id=100, data=to_can_msg))

            elif self.headers[i] == 'Date':  # ID 101 byte size = 4
                to_can_msg = []
                byte_size = 4
                date_play = int(self.row_data[i].replace("/", ""), 10)
                hex_data = '0x{0:0{1}X}'.format(date_play, byte_size * 2)
                to_can_msg = message_array(hex_data)
                bus_send.send(Message(arbitration_id=101, data=to_can_msg))

И я закрываю каждый цикл с помощью bus_send.reset(), чтобы очистить все ожидающие сообщения в очереди и начать заново в следующем цикле.

Большое спасибо!

1 Ответ

0 голосов
/ 14 мая 2019

Оказывается, я упустил важную деталь в коммуникации CAN, бит ACK, который должен быть установлен на рецессивный узел приемника.И поскольку я пытаюсь прочитать только шину CAN, используя один узел, этот узел постоянно передает первое сообщение в надежде получить бит ACK.Loopback мог бы сработать, но похоже, что pcan не поддерживает функции loopback для linux.Поэтому пришлось бы использовать второй узел CAN для получения сообщений.

...