【问题标题】:Sending messages with different ID on a pcan can bus, using python can在pcan can总线上发送不同ID的消息,使用python可以
【发布时间】:2019-05-11 00:25:05
【问题描述】:

我的程序在 pcan can-bus 上发送了近 50 条消息,所有消息都具有不同的 ID。然后再次连续循环,从第一个 ID 的新数据开始。

我已经能够初始化和发送单个 ID 消息,但我无法在总线上发送任何其他 ID。我正在使用示波器分析总线信号,因此我可以看到总线上有哪些消息。

这是代码的一部分,显示了我如何尝试在总线上发送 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() 关闭每个循环以清除队列中的所有未完成消息并在下一个循环中重新开始。

非常感谢!

【问题讨论】:

  • 信息太少,无法回答。您需要提供minimal reproducible example 或更详细地描述您的故障排除步骤。问题可能出在应用程序代码中,或者您如何使用库,或者在硬件中。例如,是否有其他 CAN 节点在总线上监听?
  • 我明白了。我是初学者,所以无法弄清楚传达我的问题的正确信息有多少。但是经过更多的研究,我想出了这个。所以在下面为自己回答。
  • 我用“总线上是否有其他 CAN 节点监听?”暗示了这一点,因为这恰好是 CAN 初学者最常见的问题 :)跨度>

标签: python-2.7 can-bus python-can


【解决方案1】:

原来我错过了 CAN 通信中的一个重要细节,即 ACK 位,需要由接收器节点将其设置为隐性。而且由于我只尝试使用一个节点读取 CAN 总线,因此该节点一直在发送第一条消息,以希望接收 ACK 位。 环回本来可以工作,但看起来 pcan 不支持 linux 的环回功能。所以必须使用第二个 CAN 节点来接收消息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-07
    • 2022-06-19
    • 1970-01-01
    相关资源
    最近更新 更多