CAN通信

chen1880 / 2024-02-20 / 原文

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实现