我有一个带有多个输入的 CAN 总线 (PCAN)。我尝试在 python 中读取输入并将它们打印在控制台上。我从总线得到的第一条消息是正确的,但是如果我改变输入的状态,消息中的数据不会改变,并且会不断吐出它得到的第一个数据。在 PCAN-view 中我可以看到数据的变化,所以这不是硬件故障。
我的代码:
import can
from time import sleep
def main():
bus = can.interface.Bus(bustype='pcan', channel='PCAN_USBBUS1', bitrate=500000)
try:
while True:
# msg = can.Message(arbitration_id=0x232, data=[0x00], is_extended_id=False)
# try:
# bus.send(msg)
# print("message sent on {}".format(bus.channel_info))
# except can.CanError:
# print("message not sent!")
msg = bus.recv(None)
try:
if msg.arbitration_id == 0x1B2:
print(msg)
if msg.arbitration_id == 0x1B3:
print(msg)
if msg.arbitration_id == 0x1B4:
print(msg)
if msg.arbitration_id == 0x1B5:
print(msg)
except AttributeError:
print("Nothing received this time")
sleep(0.2)
except KeyboardInterrupt:
print("Program Exited")
except can.CanError:
print("Message NOT sent")
bus.shutdown()
if __name__ == '__main__':
main()
我尝试在每次接收之前发送一条消息,但没有帮助。与can.Listener().stop()
打印接收到的消息后在侦听器上调用函数相同。
PCAN-view 显示硬件正在工作,因为我可以看到屏幕上发生的变化。
例如。
- 开始时,输入 0 和 1 在单元 0x1B2 上为高电平
- bus.recv 返回 [00 03],这是正确的
- 我清除输入 0 和 1
- PCAN-view 显示数据 [00 00]
- bus.recv 返回 [00 03],这是不正确的。它没有改变。
我已经阅读了几次 readthedocs,但恐怕我错过了一些东西。我需要刷新输入缓冲区吗?我只看到有关刷新输出缓冲区的函数的信息。