通过 Python 脚本使用 VN1630A Vector 设备发送和接收数据。
我目前正在尝试使用 VN1630A 设备通过 CAN 通信从 python 脚本发送和接收数据。我可以在矢量硬件管理器上看到我的设备。当我 trz 时,除了 VScode 和 Vector HardWare Manager 之外,没有其他应用程序在运行。我已在软件上将 2 个通道配置为特定的“python-can”应用程序。
我正在使用cantools的特定Vector接口来连接。
我制作了一个包含特定消息的 dbc Can 文件。
我的Python脚本
from typing import Optional
import can
import cantools
from can.interfaces import vector
from can import typechecking
MASTER_TO_SLAVE_MSG = "Master_to_slave_standard_msg"
class MasterVectorCAN():
def __init__(self, channel, dbc_file_path):
self.channel = channel
self.dbc_file_path = dbc_file_path
self.bus = None
self.db = None
def open(self):
"""
Ouvre le bus de communication.
"""
try:
self.bus = vector.VectorBus(bitrate=500000, channel=self.channel,app_name="python-can")
return True
except Exception as e:
print(f"Erreur lors de l'ouverture du bus : {e}")
return False
def send(self, counter, Command_sg,Num_selector,Table_Selector, extended_id=False):
"""
Envoie un message sur le bus de communication.
Args:
message_id (int): L'identifiant du message CAN.
data (bytes): Les données à envoyer.
extended_id (bool, optional): Si True, utilise un identifiant étendu (29 bits). Sinon, utilise un identifiant standard (11 bits). Par défaut, False.
Returns:
bool: True si l'envoi a réussi, False sinon.
"""
try:
data = {"Counter":counter,"Command_sg":Command_sg,"Num_selector":Num_selector,"Table_Selector":Table_Selector}
can_msg = self.encode_message(MASTER_TO_SLAVE_MSG,data=data)
self.bus.send(can_msg)
return True
except Exception as e:
print(f"Erreur lors de l'envoi du message : {e}")
return False
def receive(self, timeout=None):
"""
Reçoit un message depuis le bus de communication.
Args:
timeout (float, optional): Temps d'attente maximal en secondes. Si None, la fonction bloque jusqu'à ce qu'un message soit reçu. Par défaut, None.
Returns:
can.Message: Le message reçu, ou None en cas d'expiration du timeout.
"""
try:
return self.bus.recv(timeout=timeout)
except Exception as e:
print(f"Erreur lors de la réception du message : {e}")
return None
def load_dbc_file(self):
"""
Charge la configuration depuis un fichier DBC.
Returns:
bool: True si le chargement a réussi, False sinon.
"""
try:
self.bus.set_filters([{"dbc": self.dbc_file_path}])
self.db = cantools.database.load_file(self.dbc_file_path)
self.master_msg = self.db.get_message_by_name(MASTER_TO_SLAVE_MSG)
return True
except Exception as e:
print(f"Erreur lors du chargement du fichier DBC : {e}")
return False
def close(self):
"""
Ferme le bus de communication.
"""
if self.bus is not None:
self.bus.shutdown()
self.bus = None
if __name__ == "__main__":
channel = 0 # Channel du bus CAN Vector (peut varier selon la configuration matérielle)
dbc_file_path = "C:\\Users\\MPI4ABT\\Documents\\MATLAB\\Can_db.dbc"
interface = "vector"
vector_can = MasterVectorCAN(channel, dbc_file_path)
print("Instantiated")
if vector_can.open():
print("Opened")
vector_can.load_dbc_file()
# Exemple d'envoi de données
message_id = 0x123
data = b'\x01\x02\x03\x04\x05\x06\x07\x08'
vector_can.send(counter=b'x01',Command_sg=b'x01',Num_selector=b'0011',Table_Selector=b'x01',extended_id=False)
# Exemple de réception de données avec un timeout de 1 seconde
received_message = vector_can.receive(timeout=1)
if received_message:
print(f"Message reçu : {received_message}")
vector_can.close()
我目前正在发送随机消息并接收任何内容。但是,当我运行我的脚本时,调试器在
self.bus = vector.VectorBus(bitrate=500000, channel=self.channel,app_name="python-can")
上阻塞,没有任何错误,它只是阻塞。 python-can文档上没有类似的问题(使用版本4.2.2)。所以它会挡住它,不再继续前进。
除了深入研究特定于向量的 API 之外,没有找到解决此问题的方法,这可能需要我一年的时间才能解决此问题。
好吧,抱歉,实际上是因为 Vector License 问题导致无法正常运行。我使用旧的矢量软件工具并且它有效。