在 CANbus 上接收消息总是 returns 与 python-can 相同的值
Receive message on CANbus always returns same value with python-can
我有一个带有多个输入的 CAN 总线 (PCAN)。我尝试读取 python 中的输入并将它们打印在控制台上。
我从总线上得到的第一条消息是正确的,但是如果我改变输入的状态,消息中的数据不会改变并继续吐出它得到的第一个数据。
在 PCAN 视图中,我可以看到数据发生变化,因此这不是硬件故障。
我的代码:
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.recvreturns[00 03],正确
- 我清除输入 0 和 1
- PCAN-视图显示数据 [00 00]
- bus.recv returns [00 03],这是不正确的。没变。
我读过 readthedocs 好几遍了,但恐怕我漏掉了什么。我需要刷新输入缓冲区吗?我只看到有关刷新输出缓冲区的函数的信息。
因此,我决定使用缓冲区和通知程序以不同的方式实现它。我还禁用了设备的自动更新功能,因此它们不会向总线发送垃圾邮件。
我想出了这个 class 来使用公共汽车。
import can
import logging
def _get_message(msg):
return msg
class PCANBus(object):
RX_SDO = 0x600
TX_SDO = 0x580
RX_PDO = 0x200
TX_PDO = 0x180
id_unit_a = [120, 121, 122, 123]
id_unit_b = [124, 125, 126, 127]
def __init__(self):
logging.info("Initializing CANbus")
self.bus = can.Bus(channel="PCAN_USBBUS1", bustype="pcan")
self.buffer = can.BufferedReader()
self.notifier = can.Notifier(self.bus, [_get_message, self.buffer])
def send_message(self, message):
try:
self.bus.send(message)
return True
except can.CanError:
logging.error("message not sent!")
return False
def read_input(self, id):
msg = can.Message(arbitration_id=self.RX_PDO + id,
data=[0x00],
is_extended_id=False)
self.send_message(msg)
return self.buffer.get_message()
def flush_buffer(self):
msg = self.buffer.get_message()
while (msg is not None):
msg = self.buffer.get_message()
def cleanup(self):
self.notifier.stop()
self.bus.shutdown()
def disable_update(self):
for i in [50, 51, 52, 53]:
msg = can.Message(arbitration_id=0x600 + i,
data=[0x23, 0xEA, 0x5F, 0x00, 0x00, 0x00, 0x00, 0x00],
is_extended_id=False)
self.send_message(msg)
并可用作:
pcan = PCANBus()
msg = Message(arbitration_id=pcan.RX_PDO + 50, is_extended_id=False, data=[0x4F, 0x00])
pcan.send_message(msg)
ret = pcan.read_input(0x78)
pcan.cleanup()
'ret' 持有 return 消息
我有一个带有多个输入的 CAN 总线 (PCAN)。我尝试读取 python 中的输入并将它们打印在控制台上。 我从总线上得到的第一条消息是正确的,但是如果我改变输入的状态,消息中的数据不会改变并继续吐出它得到的第一个数据。 在 PCAN 视图中,我可以看到数据发生变化,因此这不是硬件故障。
我的代码:
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.recvreturns[00 03],正确
- 我清除输入 0 和 1
- PCAN-视图显示数据 [00 00]
- bus.recv returns [00 03],这是不正确的。没变。
我读过 readthedocs 好几遍了,但恐怕我漏掉了什么。我需要刷新输入缓冲区吗?我只看到有关刷新输出缓冲区的函数的信息。
因此,我决定使用缓冲区和通知程序以不同的方式实现它。我还禁用了设备的自动更新功能,因此它们不会向总线发送垃圾邮件。
我想出了这个 class 来使用公共汽车。
import can
import logging
def _get_message(msg):
return msg
class PCANBus(object):
RX_SDO = 0x600
TX_SDO = 0x580
RX_PDO = 0x200
TX_PDO = 0x180
id_unit_a = [120, 121, 122, 123]
id_unit_b = [124, 125, 126, 127]
def __init__(self):
logging.info("Initializing CANbus")
self.bus = can.Bus(channel="PCAN_USBBUS1", bustype="pcan")
self.buffer = can.BufferedReader()
self.notifier = can.Notifier(self.bus, [_get_message, self.buffer])
def send_message(self, message):
try:
self.bus.send(message)
return True
except can.CanError:
logging.error("message not sent!")
return False
def read_input(self, id):
msg = can.Message(arbitration_id=self.RX_PDO + id,
data=[0x00],
is_extended_id=False)
self.send_message(msg)
return self.buffer.get_message()
def flush_buffer(self):
msg = self.buffer.get_message()
while (msg is not None):
msg = self.buffer.get_message()
def cleanup(self):
self.notifier.stop()
self.bus.shutdown()
def disable_update(self):
for i in [50, 51, 52, 53]:
msg = can.Message(arbitration_id=0x600 + i,
data=[0x23, 0xEA, 0x5F, 0x00, 0x00, 0x00, 0x00, 0x00],
is_extended_id=False)
self.send_message(msg)
并可用作:
pcan = PCANBus()
msg = Message(arbitration_id=pcan.RX_PDO + 50, is_extended_id=False, data=[0x4F, 0x00])
pcan.send_message(msg)
ret = pcan.read_input(0x78)
pcan.cleanup()
'ret' 持有 return 消息