亚历克斯
首先,您要读取哪些变量?我的意思是,如果您尝试广播车辆速度、燃料、踏板……这些是通用消息,无需请求即可在公共汽车上使用。在 CAN 上应用数字滤波器(掩码)可能会有效地解决您的问题。请求方法更多用于特殊 ID(请参阅此处J1939-71更多信息)。
在 Python 中应用过滤器:
import can
# CAN Setting
can_interface = 'can0'
bus.set_filters([{"can_id":0xCF00400, "can_mask": 0xFFFFFFF, "extended": True},
{"can_id":0x18fee927, "can_mask": 0xFFFFFFF, "extended": True}])
bus = can.interface.Bus(can_interface, bustype='socketcan',can_filters=can_filters)
while True:
message = bus.recv()
print(message)
过滤器/遮罩的工作原理:
# The following just equals zero
0xCF00400 & 0 == 0 # True
# The following equals 0xCF00400 (217056256 in decimal) exactly
0xCF00400 & 0xFFFFFFF == 0xCF00400 # True
0xCF00400 & 0xFFFFFFF == 217056256 # True
# The following can_id would not get through the filter + mask:
0x18fee500 & 0xFFFFFFF == 0xCF00400 & 0xFFFFFFF # False
# The following obviously would get through the filter + mask:
0xCF00400 & 0xFFFFFFF == 0xCF00400 & 0xFFFFFFF # True
无论如何,老实说,我从未使用过请求方法,但也许我可以提供帮助。
首先,节点地址是经常变化还是静态的?
第二,我的程序作为外部测试设备应用程序,是否需要在每次总线打开时都进行地址声明程序,或者我可以将我从地址声明程序中获得的ID永久存储为我的应用程序?
节点作为桥接 ecu-ccu 工作,因此它们将始终相同。但是您需要始终再次请求数据,因为它们没有“在线”。
至于地址声明程序,什么是适合我的应用程序的名称字段?
我真的不明白这个问题XD。但我认为您的意思是您正在开发数据 J1939 读取器/记录器。