Отправка сообщений с разными идентификаторами на шину 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 для получения сообщений.