Gab*_*oln 4 python can-bus j1939 python-can
I have been working in a Raspberry with an MCP2515 CAN bus device for read entire values of J1939 messages on broadcasting with python .
I would like to filter the J1939 messages, but i'm not undestand the meaning of the can-mask and how I discorver that. In the docs of python-can says :
All messages that match at least one filter are returned. If filters is None or a zero length sequence, all messages are matched.
[{"can_id": 0x11, "can_mask": 0x21, "extended": False}]
Run Code Online (Sandbox Code Playgroud)
Even though I understood this 'None' part, i didn't understand how identify the mask for my ID message
Example:
I would like to just get by script just the messages with ID "0xCF00400" and "0x18fee927"
import can
# CAN Setting
can_interface = 'can0'
bus = can.interface.Bus(can_interface, bustype='socketcan_native')
while True:
message = bus.recv()
bus.set_filters([{"can_id":0xF004 , "can_mask": ?? , "extended": True},
{"can_id":0xfee9 , "can_mask": ?? , "extended": True}])
Run Code Online (Sandbox Code Playgroud)
How i should fill each variable and how I determine the mask of an ID?
UPDATING 03/10/2021
I have tried the code below, but still returning all messages
import can
# CAN Setting
can_interface = 'can0'
can_filters = [{"can_id":0xCF00400, "can_mask": 0, "extended": True},
{"can_id":0x18fee927, "can_mask": 0, "extended": True}]
bus = can.interface.Bus(can_interface, bustype='socketcan_native',can_filters=can_filters)
while True:
message = bus.recv()
print(message)
Run Code Online (Sandbox Code Playgroud)
Output:
Timestamp: 1615382511.238233 ID: 18fee500 X DLC: 8 ff ff ff ff ff ff ff ff Channel: can0
Timestamp: 1615382511.238893 ID: 18fef100 X DLC: 8 ff ff ff ff ff ff ff ff Channel: can0
Timestamp: 1615382511.247038 ID: 18fef100 X DLC: 8 ff ff ff ff ff ff ff ff Channel: can0
Timestamp: 1615382511.247611 ID: 18fee500 X DLC: 8 ff ff ff ff ff ff ff ff Channel: can0
Timestamp: 1615382511.248222 ID: 18fee900 X DLC: 8 ff ff ff ff ff ff ff ff Channel: can0
Timestamp: 1615382511.248868 ID: 0cf00400 X DLC: 8 ff ff ff ff ff ff ff ff Channel: can0
Timestamp: 1615382511.257056 ID: 0cf00400 X DLC: 8 ff ff ff ff ff ff ff ff Channel: can0
Timestamp: 1615382511.257623 ID: 18fee900 X DLC: 8 ff ff ff ff ff ff ff ff Channel: can0
Timestamp: 1615382511.258223 ID: 18fef100 X DLC: 8 ff ff ff ff ff ff ff ff Channel: can0
Timestamp: 1615382511.258827 ID: 18fee500 X DLC: 8 ff ff ff ff ff ff ff ff Channel: can0
Timestamp: 1615382511.267039 ID: 18fee500 X DLC: 8 ff ff ff ff ff ff ff ff Channel: can0
Timestamp: 1615382511.267624 ID: 18fef100 X DLC: 8 ff ff ff ff ff ff ff ff Channel: can0
Timestamp: 1615382511.268229 ID: 0cf00400 X DLC: 8 ff ff ff ff ff ff ff ff Channel: can0
Timestamp: 1615382511.268835 ID: 18fee900 X DLC: 8 ff ff ff ff ff ff ff ff Channel: can0
Timestamp: 1615382511.277035 ID: 18fee900 X DLC: 8 ff ff ff ff ff ff ff ff Channel: can0
Timestamp: 1615382511.277620 ID: 0cf00400 X DLC: 8 ff ff ff ff ff ff ff ff Channel: can0
Timestamp: 1615382511.278220 ID: 18fee500 X DLC: 8 ff ff ff ff ff ff ff ff Channel: can0
Timestamp: 1615382511.278823 ID: 18fef100 X DLC: 8 ff ff ff ff ff ff ff ff Channel: can0
Run Code Online (Sandbox Code Playgroud)
您可以使用它"can_id":0xCF00400, "can_mask": 0xFFFFFFF来有效地过滤(在内核级别)所需的 cob ID,而无需掩码/过滤器。掩码0xFFFFFFF(所有掩码位设置为 1)要求与 can_id 完全匹配。
bus.set_filters([{"can_id":0xCF00400, "can_mask": 0xFFFFFFF, "extended": True},
{"can_id":0x18fee927, "can_mask": 0xFFFFFFF, "extended": True}])
Run Code Online (Sandbox Code Playgroud)
例如,文档说:
当 时,过滤器匹配
<received_can_id> & can_mask == can_id & can_mask。如果extended也设置了,它只匹配 的消息<received_is_extended> == extended。否则,它仅根据仲裁 ID 和掩码匹配每个消息。
举个例子:
# 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
Run Code Online (Sandbox Code Playgroud)
我将把 放在循环bus.set_filters()之前while True和 之前bus.recv。这是一个设置,因此您只需在开始时设置一次即可。
最好在初始化总线时添加它,如下所示:
can_filters = [{"can_id":0xCF00400, "can_mask": 0xFFFFFFF, "extended": True},
{"can_id":0x18fee927, "can_mask": 0xFFFFFFF, "extended": True}]
bus = can.Bus(
interface="socketcan",
channel="can0",
can_filters=can_filters
)
Run Code Online (Sandbox Code Playgroud)
另外,我相信bustype='socketcan_native'已被弃用,有利于interface="socketcan". 我已经成功使用后者相当长一段时间了,并且没有警告消息。
| 归档时间: |
|
| 查看次数: |
2535 次 |
| 最近记录: |