CAN通信
Kvaser CANKing:模拟仿真CAN总线通讯


模拟器配置及发送



用Python实现can通信
方式1:pip install canlib
Welcome to canlib - a Python wrapper for Kvaser CANlib
文档地址:file:///D:/Program%20Files/Kvaser/Canlib/python/pycanlib/docs/index.html

kvaserapi.py
from canlib import canlib, Frame def print_frame(frame): """Prints a message to screen""" if (frame.flags & canlib.canMSG_ERROR_FRAME != 0): print("***ERROR FRAME RECEIVED***") else: print("{id:0>8X} {dlc} {data} {timestamp}".format( id = frame.id, dlc = frame.dlc, data= ' '.join('%02x' % i for i in frame.data), timestamp = frame.timestamp )) if __name__ == '__main__': channel_number = 1 chdata = canlib.ChannelData(channel_number) print("%d. %s (%s / %s)" % (channel_number, chdata.channel_name, chdata.card_upc_no, chdata.card_serial_no)) chd = canlib.openChannel(channel_number, canlib.canOPEN_ACCEPT_VIRTUAL) print("Setting bitrate to 500 kb/s") chd.setBusParams(canlib.canBITRATE_500K) chd.busOn() print("Sending a message") frame = Frame(id_ = 123, data =[1, 2, 3, 4, 5, 6, 7, 8], dlc = 8, flags = 0) chd.write(frame) finished = False print(" ID DLC DATA Timestamp") while not finished: try: frame = chd.read(timeout=1) if frame is not None: print_frame(frame) except(canlib.canNoMsg) as ex: pass except (canlib.canError) as ex: print(ex) finished = True # Channel teardown chd.busOff() chd.close()
方式2:pip install python-can

驱动地址:https://blog.csdn.net/qq_21649903/article/details/115940799

pythoncanapi.py
import can def print_recv(frame): print("{id:0>8X} {dlc} {data} {timestamp}".format( id=frame.arbitration_id, dlc=frame.dlc, data=' '.join('%02x' % i for i in frame.data), timestamp=frame.timestamp )) if __name__ == '__main__': channel_number = 1 # 通道号为1 CAN 1 #bus = can.interface.Bus(bustype='pcan', channel='PCAN_USBBUS1', bitrate=500000) bus = can.interface.Bus(bustype='kvaser', channel=channel_number, bitrate=500000) print("Sending a message") SendID = 1 can_data_list = [1, 2, 3, 0, 0, 0, 0, 0] # can.message(timestamp=0.0, # 时间戳 # arbitration_id = 0, # 报文id # is_extended_id = True, # 是否为扩展帧 # is_remote_frame = False, # 是否为远程帧 # is_error_frame = False, # 是否为错误帧 # channel = None, # 通道 # dlc = None, # dlc大小 # data = None, # 数据 # is_fd = False, # 是否为canfd # is_rx = True, # 是否为接收帧 # bitrate_switch = False, # 比特率开关 # error_state_indicator = False, # check = False) msg = can.Message(arbitration_id=SendID, data=can_data_list, is_extended_id=False) bus.send(msg) print(bus.state) # ⑦ BusState.ACTIVE #bus.flush_tx_buffer() #bus.reset() finished = False while not finished: try: #recv_id = 1 #can_filter = [{"can_id": recv_id, "can_mask": 0xFFFFFFFF}] # filter = can.Filter(can_id=1, can_mask=0xFFFFFFFF) # bus.set_filters(filter) rx_msg = bus.recv(timeout=1) if rx_msg is not None: print_recv(rx_msg) except can.CanError as ex: print(ex) finished = True bus.shutdown()
用C#实现
用qt实现
qq:505645074