Отправка сообщений с разными идентификаторами на шину pcan can с использованием python can

Моя программа отправляет почти 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 ответ

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

Другие вопросы по тегам