1. ¼¼Êõ²©¿Í

    21/12/2021 ×÷Õß ÔÆº£ÓÎÏ·

    KVASER CANlib & PythonµÚ2²¿·Ö£º²âÊÔºÍʾÀý

    ÕâÊǵڶþƪ½éÉÜÔÆº£ÓÎÏ· CANlibºÍPython CANlib WrapperµÄÎÄÕ¡£

    ÔÚ±¾ÎÄÖУ¬ÎÒÃǽ«½éÉÜÉæ¼°CANµÄһЩµäÐͳ¡¾°£¬Á˽âÔÚʹÓÃCANʱµÄ²»Í¬ÃüÁîºÍ¹¦ÄÜ£¬²¢¸ü¹ã·ºµØÁ˽âCAN¡¢CANlibºÍÔÆº£ÓÎϷͨѶÒÇ¡£

    ×÷ÕߣºAnton Carlsson£¬ Èí¼þ¿ª·¢ÈËÔ±

    ¹²Í¬×÷ÕߣºL-G Fredriksson£¬ÏÖ³¡Ó¦Óù¤³Ìʦ

    °æ±¾£º2021-08-09A

    ±¾ÎĵÄÄ¿±ê¶ÁÕßÓÐÄÄЩ£¿

    ±¾Ö¸ÄÏÃæÏòÄÇЩÏëÒªÉèÖúÍʹÓôøÓÐCANlibºÍPython CANlib°ü/·â×°µÄÔÆº£ÓÎÏ· CANͨѶÒǵÄÓû§¡£

    ÔÚʹÓñ¾Ö¸ÄÏ֮ǰ£¬Óû§ÐèÒª¶ÔÏÂÊöÄÚÈÝÓÐЩÐíÁ˽⣨»òÄܹ»²éÔÄÒÔÏÂÄÚÈÝ£©£º

    • ¶Ô½«ÒªÊ¹ÓõIJÙ×÷ϵͳÓÐÒ»¶¨Á˽⡣ÔÚʹÓÃLinux¶ø·ÇWindowsʱ£¬ÔòÐèÕÆÎÕ¸ü¶àµÄ֪ʶ¡£
    • ÖªµÀÈçºÎ´ò¿ªºÍʹÓÃÃüÁîÐÐÓ¦ÓóÌÐòÖеĻù±¾ÃüÁ±ÈÈçÃüÁîÌáʾ·û»òWindows PowerShell¡£
    • Àí½â±à³ÌµÄ¹¤×÷Ô­Àí²¢·ÇÊDZØÒªµÄ£¬µ«»áÓÐËù°ïÖú¡£ÁíÍ⣬Èç¹ûÓµÓÐPythonµÄÏà¹Ø¾­Ñ飬¶¼½«¼«´ó¼ò»¯Ñ§Ï°¹ý³Ì¡£

    ΪCANlib×¼±¸Python

    ÇëÔĶÁÎĵµ£ºÔƺ£ÓÎÏ· CANlib & PythonµÚ1²¿·Ö£¬³õʼÉèÖÃ

    Çë×¢Ò⣺ÎÄÖÐµÄÆäÖÐһЩʾÀýÊÇΪÈý¸öͨѶÒDZàдµÄ¡£

    ¿ìËÙÈëÃÅÓë¹Ø¼üÃüÁî

    Èç¹ûÄúÖжÏÁ˲Ù×÷»òÍü¼ÇÁËʹÓõÄÃüÁî/Á÷³Ì£¬ÇëʹÓÃÒÔÏÂÇ¿´óµÄÃüÁîºÍ˵Ã÷Áбí¡£

    • ? Æô¶¯Windows Powershell£º
      powershell.exe
    • ? Çл»µ½Äú´æ·ÅPython½Å±¾µÄĿ¼£ºcd£¨Èç¹ûÄúÒѾ­ÓÐÒ»¸öÐéÄâ»·¾³²¢ÇÒ¾ßÓÐÔËÐÐȨÏÞ£¬ÔòÌø¹ý½ÓÏÂÀ´µÄÁ½¸ö²½Ö裩
    • ? ´´½¨Ò»¸öÐéÄâ»·¾³£º
      py -3 -m venv .venv --prompt.
    • ? Èç¹ûÄúÊÇʹÓÃмÆËã»ú»òûÓÐȨÏÞµÄÐÂÓû§£º
      Set-ExecutionPolicy Unrestricted -Scope CurrentUser
    • ? ¼¤»îÐéÄâ»·¾³£º
      .\.venv\Scripts\activate
    • ? Èç¹ûÄúÉÐδÔÚ´ËÐéÄâ»·¾³Öа²×°canlib£¬ÇëÖ´ÐÐÒÔϲÙ×÷£º
      pip install canlib
    • ? ¡­
    • ? ÔËÐнű¾£ºpy check_ch.py¡±£¨check_ch.pyÒ»Ö±¿ÉÒÔÔËÐУ¬ÒÔÈ·±£ËùÐèµÄͨѶÒÇÒÑÁ¬½Ó£©
    • ? Æô¶¯±à¼­Æ÷£º
      python -m idlelib
      python -m idlelib check_ch.py
    • ? ¡­
    • ? Í£ÓÃÐéÄâ»·¾³£º
      deactivate

    ·¢ËÍCAN±¨ÎÄ

    £¨´Ë²¿·ÖÄÚÈÝÊÇ´Ó¡¶Ôƺ£ÓÎÏ· CANlib & PythonµÚ1²¿·Ö£¬³õʼÉèÖá·Öи´ÖÆ£©

    ¼òµ¥·½·¨

    Òª·¢ËÍ»ù±¾µÄCAN±¨ÎÄ£¬Çë´´½¨Ò»¸öÃûΪsend_msg.pyµÄ½Å±¾£¬ÄÚÈݰüº¬ÒÔÏ´úÂ루ȷ±£¸Ã½Å±¾ÓëÐéÄâ»·¾³Î»ÓÚͬһÎļþ¼ÐÖУ©£º

    #send_msg
    #The CANlib library is initialized when the canlib module is imported. To be
    # able to send a message, Frame also needs to be installed.
    from canlib import canlib, Frame
    
    # Firstly, open two CAN channels, one to send the message and one to receive.
    # Note that there needs to be a channel to receive, as otherwise the message
    # can not be sent. In this example the channels are named ch_a and ch_b. To
    # open the channels call on the openChannel method inside of canlib and, as an
    # input put in channel=0 and channel=1. Where 0 and 1 represents the two
    # CANlib channels 0 and 1.
    ch_a = canlib.openChannel(channel=0)
    ch_b = canlib.openChannel(channel=1)
    
    # After opening the channel, we need to set the bus parameters. Some
    # interfaces keep their params from previous programs. This can cause problems
    # if the params are different between the interfaces/channels. For now we will
    # use setBusParams() to set the canBitrate to 250K.
    ch_0.setBusParams(canlib.canBITRATE_250K)
    ch_1.setBusParams(canlib.canBITRATE_250K)
    
    # The next step is to Activate the CAN chip for each channel (ch_a and ch_b in
    # this example) use .busOn() to make them ready to receive and send messages.
    ch_a.busOn()
    ch_b.busOn()
    
    # To transmit a message with (11-bit) CAN id = 123 and contents (decimal) 72, 
    # 69, 76, 76, 79, 33, first create the CANFrame (CANmessage) and name it. In
    # this example, the CANFrame is named frame. Then send the message by calling on
    # the channel that will act as the sender and use .write() with the CANFrame
    # as input. In this example ch_a will act as sender.
    frame = Frame(id_=123, data=[72, 69, 76, 76, 79, 33])
    ch_a.write(frame)
    
    # To make sure the message was sent we will attempt to read the message. Using
    # timeout, only 500 ms will be spent waiting to receive the CANFrame. If it takes
    # longer the program will encounter a timeout error. read the CANFrame by calling
    # .read() on the channel that receives the message, ch_b in this example. To
    # then read the message we will use print() and send msg as the input.
    msg = ch_b.read(timeout=500)
    print(msg)
    
    # After the message has been sent, received and read it is time to inactivate
    # the CAN chip. To do this call .busOff() on both channels that went .busOn()
    ch_a.busOff()
    ch_b.busOff()?
    # Lastly, close all channels with close() to finish up.
    ch_a.close()
    ch_b.close()
    
    # Depending on the situation it is not always necessary or preferable to go of
    # the bus with the channels and, instead only use close(). But this will be
    # talked more about later.

    ÒªÔËÐÐǰÊö³ÌÐò£¬Ç뼤»îÄúµÄÐéÄâ»·¾³²¢Ê¹ÓÃpowershellÔËÐнű¾¡£ÔËÐиóÌÐò½«»á²úÉúÒÔÏÂÀàËÆµÄ½á¹û£º

    > .\.venv\Scripts\activate
    (pyproj)> py send_msg.py
    Frame(id=123, data=bytearray(b'HELLO!'), dlc=6, flags=<MessageFlag.STD: 2>, timestamp=9)

    ´ò¿ªÐéÄâͨѶÒǵļòµ¥·½·¨

    Èç¹ûÎÒÃÇÏëҪʹÓÃÐéÄâͨѶÒǺÍÐéÄâͨµÀ£¬ÎÒÃÇÐèÒª¸ü¸ÄopenchannelÃüÁî¡£Ê×ÏÈ£¬ÎÒÃÇÐèÒª½«Êý×Ö´Ó0ºÍ1¸ü¸ÄΪ2ºÍ3£¬ÒÔ±íʾÐéÄâͨµÀ¡£È»ºó£¬ÎÒÃÇÐèÒªÌí¼ÓÒ»¸ö±íʾACCEPT_VIRTUALµÄ±êÖ¾£¨ÁíÒ»¸öÊäÈ룩£¬ÒÔ¶¨ÒåÐéÄâͨµÀ½«±»Ê¹ÓúͽÓÊÜ¡£ÃüÁîÏÖÔÚ½«ÈçÏÂËùʾ£º

    	canlib.openChannel(channel=2, flags=canlib.open.ACCEPT_VIRTUAL)

    Èç¹ûÎÒÃDz»Ìí¼ÓACCEPT_VIRTUAL±êÖ¾£¬½«»áÊÕµ½¡°Specified device not found (-3)£¨Ö¸¶¨É豸δÕÒµ½£¨-3£©£©¡±µÄ´íÎó¡£ÁíÍ⻹Ðè×¢Ò⣬ÐéÄâͨµÀÖ»ÄÜÓëÁíÒ»¸öÐéÄâͨµÀͨѶ¡£

    ¸ü¾ßPython·ç¸ñµÄ·½Ê½

    ·¢ËÍCAN±¨ÎÄÖÐʹÓõĴúÂëÊÇÖַdz£±ê×¼ºÍÖ±½ÓµÄ½Å±¾±àд·½Ê½¡£È»¶ø£¬Í¨¹ýPython£¬ÎÒÃÇÄܹ»ÒÔ¸ü¾ß¡°Python·ç¸ñµÄ·½Ê½¡±±àд´úÂë¡£Õ⽫Éú³ÉÒÔϽű¾Ãûsend_msg_pyt.py£º

    # send_msg_pyt
    from canlib import canlib, Frame
    
    # instead of opening the two channels and closing them one by one, we will use a
    # with statement. Using the with statement to open one or more channels with
    # canlib.openChannel(i) as ch_x. Within this with statement we will write the
    # rest of the code.
    with canlib.openChannel(2) as ch_a, canlib.openChannel(3) as ch_b:
    
    # Instead of going on bus with "copy-paste" for each channel, we will use a
    # for-loop. Within this loop we will go through a list of all channels opened
    # using the with statement. Currently we only have two channels, which makes
    # the for-loop somewhat unnecessary. However, when we start using more
    # channels the for-loop will be preferred.
        for ch in [ch_a, ch_b]:
            ch.busOn()
    
        frame = Frame(id_=123, data=[72, 69, 76, 76, 79, 33])
        ch_a.write(frame)
    
        msg = ch_b.read(timeout=500)
        print(msg)
    
    # After we run out of code within the with statement and exit it, we don’t
    # need to manually close it or go off bus. The channels that were open using
    # the with statement will be automatically closed, and with the channels being
    # closed they also went off the bus.

    Wait

    ÔÚ±àд¶àÌõ±¨ÎÄʱ£¬ÎÒÃÇÓÐʱºòÏëҪȷÈÏËüÃÇÊÇ·ñÒÑÕýÈ··¢ËÍ¡£Îª´Ë£¬ÎÒÃǽ«Ê¹ÓÃwriteWait()ÃüÁî¡£writeWaitÔÚ·¢Ëͱ¨ÎÄʱµÄ²Ù×÷ÓëwriteÏàͬ£¬µ«ËüÒ²»á¸ø³öµÈ´ý±¨ÎÄ·¢Ë͵ij¬Ê±ÏÞÖÆ¡£

    ¸ÃÃüÁî¿ÉÄÜÈçÏÂËùʾ£ºwriteWait(frame, timeout=500)£¬Ëü½«Ê¹ÓÃÖ¡ÌṩµÄÏêϸÐÅÏ¢·¢Ëͱ¨ÎÄ£¬²¢ÔÚ·µ»Ø´íÎó±¨ÎÄ¡°Timeout occurred (-7)£¨·¢Éú³¬Ê±£¨-7£©£©¡±Ö®Ç°µÈ´ý500ºÁÃëÒÔʹÆä·¢ËÍÍê³É¡£WriteWait¿ÉÓÃÓÚ·¢ËÍÒ»¸ö»ò¶à¸ö±¨ÎÄ¡£ÔÚ·¢ËͶà¸ö±¨ÎÄʱ£¬ÎÒÃÇ¿ÉÒÔÔÚÿ¸ö±¨ÎÄÉÏʹÓÃwriteWait£¬µ«Õ⽫»¨·ÑһЩʱ¼ä£¬Ð§Âʲ»¸ß¡£Ïà·´£¬ÎÒÃÇ¿ÉÒÔÔÚ³ýÁË×îºóÒ»¸ö±¨ÎÄÖ®ÍâµÄËùÓб¨ÎÄÉÏʹÓÃwrite£¬²¢ÔÚ×îºóÒ»¸ö±¨ÎÄÉÏʹÓÃwriteWait¡£Èç¹ûij¸ö±¨ÎÄ·¢ËÍʧ°Ü£¬ÄÇôÔÚÆäºóµÄËùÓб¨Îͼ½«Ê§°Ü£¬writeWait½«Òý·¢³¬Ê±´íÎó¡°Timeout occurred (-7)£¨·¢Éú³¬Ê±£¨-7£©£©¡±¡£

    ΪÁ˲âÊÔwriteWait£¬ÎÒÃǽ«´´½¨Á½¸ö½Å±¾£¬·Ö±ð³ÆÎªsend_msg_wait.pyºÍsend_msgs_wait.py£¬ËüÃǽ«»ùÓÚ·¢Ëͱ¨ÎÄ´úÂ룬µ«½øÐÐÁËһЩ¸ü¸Ä¡£µÚÒ»¸ö½Å±¾send_msg_wait.py½«Ê¹ÓÃwriteWait·¢ËÍÒ»Ìõ³É¹¦±¨ÎĺÍÒ»Ìõ²»³É¹¦µÄ±¨ÎÄ£º

    # send_msg_wait
    from canlib import canlib, Frame
    
    # We will now open three channels, two from the USBcan and one on
    # the leaf pro which we will not connect to the T-cannector. We will use the
    # leaf pro channel ch_c to send errorframes.
    with canlib.openChannel(2) as ch_a, canlib.openChannel(3) as ch_b, canlib.openChannel(4) as ch_c:
        for ch in [ch_a, ch_b, ch_c]:
            ch.busOn()
    
        frame = Frame(id_=123, data=[72, 69, 76, 76, 79, 33])
        
    # Instead of using write we will now use writeWait(). We will attempt to send
    # a message for 500 milliseconds, if the message is not sent we will receive a
    # Timeout occured error.
        ch_a.writeWait(frame, timeout=500)
    
    # We will now try to send a message with the channel not connected to the
    # T-cannector. This should result in a Timeout occurred error.
        ch_c.writeWait(frame, timeout=500)
    
        msg = ch_b.read(timeout=500)
        print(msg)

    ÔÚÏÂÒ»¸ö½Å±¾send_msgs_wait-pyÖУ¬ÎÒÃǽ«·¢ËͶàÌõ±¨ÎÄ£¬²¢Ê¹ÓÃwaitWriteÈ·±£±¨ÎÄÒÑ·¢ËÍ£º

    # send_msgs_wait
    from canlib import canlib, Frame
    
    # We will now open three channels, two from the USBcan and one on the
    # leaf pro which we will not connect to the T-cannector. We will use the
    # leaf pro channel ch_c to send errorframes.
    with canlib.openChannel(2) as ch_a, canlib.openChannel(3) as ch_b, canlib.openChannel(4) as ch_c:
        for ch in [ch_a, ch_b, ch_c]:
            ch.busOn()
    
        frame = Frame(id_=123, data=[72, 69, 76, 76, 79, 33])
        ?# We will now send 199 messages in a for-loop and after the loop use writeWait
    # to send a last message, to make sure all previous messages were sent.
        for i in range(199):
            ch_a.write(frame)
        ch_a.writeWait(frame, timeout=500)?
        msg = ch_b.read(timeout=500)
        print(msg)
    
    # We will now do the same with the ch_c channel not connected to the
    # T-cannector. This should result in a timeout error.
        for i in range(199):
            ch_c.write(frame)
        ch_c.writeWait(frame, timeout=100)
    
        msg = ch_b.read(timeout=500)
        print(msg)

    ËùÐèÓ²¼þ

    ×÷Ϊ±¾Ö¸Äϵĵڶþ²¿·Ö£¬ÎÒÃǽ«ÐèÒªÖÁÉÙÈý¸öͨµÀ¡£Òò´Ë£¬ÔÚµÚÒ»²¿·ÖÖÐÎÒÃÇʹÓõÄÉ豸ûÓÐÈý¸öͨµÀ£¬ÎÒÃÇÔò»¹ÐèÒªÁíÒ»¸öÉ豸¡£ÔÚ±¾Ö¸ÄÏÖУ¬½«Ê¹ÓÃÔÆº£ÓÎÏ· Leaf Pro HS v2ÒÔ¼°Ôƺ£ÓÎÏ· USBcan Pro 2xHS v2¡£

    ¾²Ä¬Ä£Ê½

    µ±Ê¹ÓÃ×ÜÏßÉϵÄCANͨµÀ£¨ÒÑͨ¹ýbusOnÁ¬½Óµ½×ÜÏßÉϵÄͨµÀ£©Í¨¹ýCANlib½ÓÊÕ±¨ÎÄʱ£¬ÓÐÁ½ÖÖ¿ÉÄܵÄģʽ¿É¹©Ñ¡Ôñ¡£ÕâÁ½ÖÖģʽÊÇÕý³£Ä£Ê½ºÍ¾²Ä¬Ä£Ê½£¬³ÆÎª×ÜÏßģʽ¡£ÒªÉèÖÃ×ÜÏßÇý¶¯³ÌÐòģʽ£¬ÇëʹÓá°Channel.setBusOutputControl¡±¡£

    Õý³£Ä£Ê½

    Õý³£Ä£Ê½ÊÇÔÆº£ÓÎϷͨѶÒǵÄĬÈÏģʽ£¬¿ÉʹÓÃsetBusOutputControlÊÖ¶¯ÉèÖÃΪ¡°canlib.canlib.Driver.NORMAL¡±¡£Õý³£Ä£Ê½Òâζ×ÅÇý¶¯³ÌÐòÊDZê×¼µÄÍÆÀ­Ä£Ê½¡£Ò²¾ÍÊÇ˵£¬Ëü¼È¿ÉÒÔÔÚ×ÜÏßÉÏ·¢ËÍ£¨ÍÆ£©ÐÅÏ¢£¬Ò²¿ÉÒÔ½ÓÊÕ£¨À­£©ÐÅÏ¢¡£

    ¾²Ä¬Ä£Ê½

    ¾²Ä¬Ä£Ê½ÓÉһЩ¿ØÖÆÆ÷Ö§³Ö£¬¿ÉÒÔʹÓÃsetBusOutputControlÉèÖÃΪ¡°canlib.canlib.driver.SILENT¡±¡£ÔÚ¾²Ä¬Ä£Ê½Ï£¬Çý¶¯³ÌÐò½«ÉèÖÃΪ½ö½ÓÊÕ¡£ÕâÒâζ×Å¿ØÖÆÆ÷½«²»»áÔÚ×ÜÏßÉÏ´«ÊäÈκζ«Î÷£¬ÉõÖÁ²»»á´«Êäack£¨È·ÈÏ£©Î»¡£ÕâÊÊÓÃÓÚ£ºµ±ÎÒÃÇÏëÒª¼àÌýCAN×ÜÏß¶øÓÖ²»ÏëÒÔÈκη½Ê½È¥¸ÉÈÅʱ¡£ÔÚµ÷ÓÃ.writeʱ£¬ÈÔÈ»¿ÉÒÔʹÓþ²Ä¬Í¨µÀ£¬µ«±¨ÎĽ«²»»á±»Õý³£·¢ËÍ¡£Ïà·´£¬±¨ÎĽ«½øÈë¡°´«Êä¶ÓÁС±¶ø²»»á±»·¢ËÍ¡£µ±´«Êä¶ÓÁÐÖеı¨ÎĹý¶à²¢³öÏÖ´«Ê仺³åÇøÒç³ö´íÎóʱ£¬ÕâÒ»µã¾Í»á±äµÃÃ÷ÏÔ¡£

    Çë×¢Ò⣬²¢²»ÊÇËùÓÐÉ豸¶¼Ö§³Ö¾²Ä¬Ä£Ê½¡£µ«ÊÇ£¬µ±ÎÒÃdz¢ÊÔÉèÖò»Ö§³Ö¾²Ä¬Ä£Ê½µÄÉ豸ʱ£¬½«²»»áÊÕµ½ÀàËÆ¡°É豸δ¸ü¸ÄÆäģʽ¡±µÄÈκÎָʾ¡£Ïà·´£¬¸ÃÉ豸½«·¢Ëͱ¨ÎIJ¢ÏñÕý³£Ä£Ê½ÏµÄÉ豸һÑùÔËÐС£Èç¹ûÎÒÃÇÔÚûÓиü¸ÄÆäͨµÀµÄÇé¿öÏÂÇл»É豸£¬Õâ¿ÉÄÜ»á³ÉΪÎÊÌâ¡£Òò´Ë£¬ÔÚ½«Í¨µÀÉèÖÃΪ¾²Ä¬Ä£Ê½Ö®Ç°£¬ÎÒÃÇҪȷ±£Í¨µÀ/É豸֧³Ö¾²Ä¬Ä£Ê½¡£ÓÐÁ½ÖÖ·½·¨¿ÉÒÔ×öµ½ÕâÒ»µã¡£ÎÒÃÇ¿ÉÒÔ´ÓÔÆº£ÓÎÏ·ÍøÕ¾»ñÈ¡Óû§Ö¸ÄÏ£¬²é¿´¼¼Êõ²ÎÊý²¢ÔÚ±í¸ñÖÐÈ·ÈÏÊÇ·ñÖ§³ÖËü¡£»òÕߣ¬¸ü¿ÉÈ¡µÄ·½·¨ÊÇʹÓÃchannel_data¡£Òª»ñȡͨµÀµÄ¹¦ÄÜ£¬ÇëʹÓÃchannel_data.channel_cap¡£È»ºó´´½¨Ò»¸öifÓï¾ä£¬²é¿´channel_data.channel_capÖÐÊÇ·ñ°üº¬ChannelCap.SILENT_MODE£¨¾²Ä¬Ä£Ê½£©¡£

    ʾÀý

    ΪÁËչʾÈçºÎʹÓþ²Ä¬Ä£Ê½£¬ÎÒÃǽ«Öظ´Ê¹Ó÷¢ËÍCAN±¨ÎĵÄʾÀý²¢½øÐÐÀ©Õ¹¡£ÏÈǰʹÓõÄ×¢ÊÍÒѱ»É¾³ý£¬²¢ÎªÐ´úÂëÌí¼ÓÁËÐÂ×¢ÊÍ¡£

    µÚÒ»¸öʾÀýÏÔʾ£¬¾²Ä¬Í¨µÀ²»»á¸ÉÈÅÀ´×ÔÁíÒ»¸öͨµÀµÄ·¢Ëͱ¨ÎÄ¡£Ôڽű¾ÖÐʹÓÃÒÔÏ´úÂ룺

    # silent_mode
    from canlib import canlib, Frame
    
    ch_a = canlib.openChannel(channel=0)
    ch_b = canlib.openChannel(channel=1)
    
    # Using the setBusOutputControl method we set ch_a (channel 0) to normal. This 
    # line is not necessary, as normal is the default mode, but for the sake of
    # clarity we will add it anyway. Then we do the same to the channel ch_b
    # (channel 1) but set it to silent.
    ch_a.setBusOutputControl(canlib.Driver.NORMAL)
    # before setting the second channel, we need to make sure that the channel
    # actually supports silent mode. For this we will use an if statement.
    if canlib.ChannelCap.SILENT_MODE in ch_b.channel_data.channel_cap:
    ch_b.setBusOutputControl(canlib.Driver.SILENT)
    # If the channel does not support silent mode we will exit the program.
    else:
    exit()
    # The rest of the code will remain unchanged.
    ch_a.busOn()
    ch_b.busOn()
    
    frame = Frame(id_=123, data=[72, 69, 76, 76, 79, 33])
    ch_a.write(frame)
    
    msg = ch_b.read(timeout=500)
    print(msg)
    
    ch_a.busOff()
    ch_b.busOff()
    
    ch_a.close()
    ch_b.close()

    ÔËÐдËsilent_mode½Å±¾»áµ¼ÖÂÒÔÏ´íÎóÖ¡£¨CAN´íÎó±¨ÎÄ£©£º

    (pyproj)> py silent_mode.py
    Frame(id=0, data=bytearray(b''), dlc=0, flags=<MessageFlag.ERROR_FRAME: 32>, timestamp=15)
    

    ¸Ã±¨ÎÄ£¨Ö¡£©ÓÉͨµÀch_a·¢ËÍ£¬µ«ÔÚ±¨ÎÄ·¢Ë͹ý³ÌÖУ¬Ëü±ä³ÉÁË´íÎó±¨ÎÄ£¨´íÎóÖ¡£©¡£ÕâÒâζ×ÅûÓÐÆäËûͨµÀÊÕµ½¸Ã±¨ÎÄ£¬Òò´ËδÌí¼ÓÈ·ÈÏλ¡£Õâ±íÃ÷£¬¾¡¹ÜͨµÀch_b¶ÁÈ¡Á˱¨ÎÄ£¬µ«ËüûÓÐÌí¼ÓÈ·ÈÏ룬ÕâÖ¤Ã÷Á˾²Ä¬Í¨µÀ²»»á¸ÉÈÅ×ÜÏßÉÏ·¢Ë͵ÄÈκÎÐÅÏ¢Á÷¡£

    ÏÂÒ»¸ö²âÊÔÊÇʹÓþ²Ä¬Í¨µÀ·¢Ëͱ¨ÎIJ¢¹Û²ìCANͨѶÒÇ¡£Õâ´ÎÎÒÃǽ«²»±àд½Å±¾£¬¶øÊÇʹÓÃpython½âÊÍÆ÷¡£ÒªÆô¶¯python½âÊÍÆ÷²¢·¢Ëͱ¨ÎÄ£¬ÇëÔÚpowershellÖмüÈëÒÔÏÂÄÚÈÝ£º

    > .\.venv\Scripts\activate
    (pyproj) PS C:\Users\extac\Pyproj> py
    Python 3.9.5 (tags/v3.9.5:0a7dcbd, May  3 2021, 17:27:52) [MSC v.1928 64 bit (AMD64)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>> from canlib import canlib, Frame
    >>> ch = canlib.openChannel(channel=1)
    >>> ch.setBusOutputControl(canlib.Driver.SILENT)
    >>> ch.busOn()
    >>> frame = Frame(id_=123, data=[72, 69, 76, 76, 79, 33])
    >>> ch.write(frame)

    Õâ²»»áµ¼ÖÂpython½âÊÍÆ÷ÖеÄÈκδíÎ󣬵«Èç¹ûÎÒÃÇ²é¿´ÔÆº£ÓÎÏ· CANͨѶÒÇ£¬Í¨µÀled½«ÉÁ˸ΪºìÉ«£¬±íʾ³öÏÖ´íÎó£¨Çë²ÎÔÄÏÂͼ£¬ÄĸöledÉÁ˸ȡ¾öÓÚÄĸöͨµÀÓöµ½´íÎ󣩡£µ±ÎÒÃDz鿴ÍêÉÁ˸µÄָʾµÆ£¬Çë°´ÒÔϲ½Öè¹Ø±Õ×ÜÏߣº

    >>> ch.busOff()
    >>> ch.close()

    Á¬½Óµ½¼ÆËã»úµÄÔÆº£ÓÎÏ· CANͨѶÒÇ£¨ÓÉPWRµÄÂ̵ÆÖ¸Ê¾£©ÔÚÆäµÚ¶þͨµÀÉϽÓÊÕµ½´íÎó£¨ÓÉCAN 2ÉÏµÄºìµÆÉÁ˸ָʾ£©¡£

    ΪÁËÔÚ½âÊÍÆ÷ÖнÓÊÕµ½´íÎó£¬ÎÒÃÇÐèҪͬʱ·¢Ë͸ü¶àµÄ±¨ÎÄ¡£Îª´Ë£¬ÎÒÃǽ«Ê¹ÓÃforÑ­»·À´°üΧwrite()ÃüÁÈÔÈ»ÔÚpowershellÄÚʹÓÃPython½âÊÍÆ÷£©£º

    > .\.venv\Scripts\activate
    (pyproj) PS C:\Users\extac\Pyproj> py
    Python 3.9.5 (tags/v3.9.5:0a7dcbd, May  3 2021, 17:27:52) [MSC v.1928 64 bit (AMD64)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>> from canlib import canlib, Frame
    >>> ch = canlib.openChannel(channel=1)
    >>> ch.setBusOutputControl(canlib.Driver.SILENT)
    >>> ch.busOn()
    >>> frame = Frame(id_=123, data=[72, 69, 76, 76, 79, 33])
    >>> for i in range(2000):
    ...     ch.write(frame)
    Traceback (most recent call last):
      File "<stdin>", line 2, in <module>
      File "C:\Users\extac\Pyproj\.venv\lib\site-packages\canlib\canlib\channel.py", line 718, in write
        dll.canWrite(self.handle, frame.id, bytes(frame.data), frame.dlc, frame.flags)
      File "C:\Users\extac\Pyproj\.venv\lib\site-packages\canlib\canlib\dll.py", line 177, in _error_check
        raise can_error(result)
    canlib.canlib.exceptions.CanGeneralError: Transmit buffer overflow (-13)

    ÇëÔٴμÇס£¬Íê³ÉºóÒª¹Ø±Õ×ÜÏߺÍͨµÀ¡£

    >>> ch.busOff()
    >>> ch.close()

    ¶ÔÓÚÏÂÒ»¸öʾÀý£¬ÎÒÃÇÐèÒªÌí¼ÓµÚÈý¸öͨµÀ£¬ÒÔ±ãÄܹ»·¢Ëͱ¨ÎÄ£¬²¢Ê¹Óþ²Ä¬Í¨µÀ¶ÁÈ¡±¨ÎÄ¡£Çë×¢Ò⣬ΪÁËÄܹ»Ê¹Óþ²Ä¬Í¨µÀ£¬±ØÐëÖÁÉÙÓÐÁ½¸öÆäËûͨµÀ¿ÉÒÔÕý³£·¢ËͺͽÓÊÕ±¨ÎÄ¡£ÔÚ±¾Ö¸ÄÏÖУ¬ÎÒÃǽ«Ìí¼ÓÒ»¸öÔÆº£ÓÎÏ· Leaf Pro HS v2£¬µ«ÈÎºÎÆäËûÖÁÉÙÓÐÒ»¸öͨµÀµÄCANͨѶÒǶ¼¿ÉÒÔ¡£Òª²é¿´ÊÇ·ñÓÐÁ½¸öÒÔÉϵÄͨµÀ¿ÉÓã¬ÇëÔÙ´ÎÔËÐнű¾check_ch£¬¶ÔÓÚ±¾Ê¾Àý£¬½á¹ûÈçÏ£º

    	(pyproj)> py check_ch.py
    	Found 5 channels
    	0. ÔÆº£ÓÎÏ· USBcan Pro 2xHS v2 (channel 0) (00752-9:13406/0)
    	1. ÔÆº£ÓÎÏ· USBcan Pro 2xHS v2 (channel 1) (00752-9:13406/1)
    	2. ÔÆº£ÓÎÏ· Leaf Pro HS v2 (channel 0) (00843-4:10012/0)
    	3. ÔÆº£ÓÎÏ· Virtual CAN Driver (channel 0) (00000-0:0/0)
    	4. ÔÆº£ÓÎÏ· Virtual CAN Driver (channel 1) (00000-0:0/1)
    

    ÓëÉÏ´ÎÔËÐÐcheck_chʱÏà±È£¬ÐéÄâͨµÀÒÑ´Ó2ºÍ3½µÖÁ3ºÍ4¡£CANͨµÀ2Òѱ»ÐÂÌí¼ÓµÄÔÆº£ÓÎÏ· Leaf Pro CANͨѶÒÇÕ¼Óá£

    ÏÂÒ»²½ÊÇʹÓÃÁ½¸öÕý³£Í¨µÀ·¢Ëͱ¨ÎIJ¢Ê¹ÓõÚÈý¸ö¾²Ä¬Í¨µÀ½øÐмàÌý¡£Ôٴλص½CAN±¨ÎÄʾÀý²¢Ìí¼Ó´úÂ룬´Ë½Å±¾½«±»ÃüÃûΪsilent_listen£º

    # silent_listen
    from canlib import canlib, Frame
    
    # Open a third channel (channel 2) and name it ch_c.
    ch_a = canlib.openChannel(channel=0)
    ch_b = canlib.openChannel(channel=1)
    ch_c = canlib.openChannel(channel=2)
    
    # Set ch_a and ch_b to normal, again unnecessary but to clarify,
    ch_a.setBusOutputControl(canlib.Driver.NORMAL)
    ch_b.setBusOutputControl(canlib.Driver.NORMAL)
    # and ch_c to silent.
    if canlib.ChannelCap.SILENT_MODE in ch_c.channel_data.channel_cap:
    ch_c.setBusOutputControl(canlib.Driver.SILENT)
    else:
        exit()
    
    # Put the third channel ch_c on the bus.
    ch_a.busOn()
    ch_b.busOn()
    ch_c.busOn()
    
    frame = Frame(id_=123, data=[72, 69, 76, 76, 79, 33])
    ch_a.write(frame)
    
    # Add ch_c to read the message as the silent channel to read the message.
    msg_c = ch_c.read(timeout=500)
    msg_b = ch_b.read(timeout=500)
    
    # Print both messages to compare them.
    print("msg c:”)
    print(msg_c)
    print("msg b:”)
    print(msg_b)
    
    # Go off bus with all three channels.
    ch_a.busOff()
    ch_b.busOff()
    ch_c.busOff()
    
    # Lastly, close all channels.
    ch_a.close()
    ch_b.close()
    ch_c.close()

    ÔÚpowershellÖÐÔËÐиýű¾½«²úÉúÒÔϽá¹û£º

    (pyproj)> py silent_listen.py
    msg c:
    Frame(id=123, data=bytearray(b'HELLO!'), dlc=6, flags=<MessageFlag.STD: 2>, timestamp=2)
    msg b:
    Frame(id=123, data=bytearray(b'HELLO!'), dlc=6, flags=<MessageFlag.STD: 2>, timestamp=5)

    ÎÒÃÇÏÖÔÚ¿ÉÒÔ¿´µ½£¬¾²Ä¬Í¨µÀch_c¿ÉÒÔ¶ÁÈ¡±¨ÎÄ£¬ch_bÒ²¶ÁÈ¡Á˱¨ÎÄ£¬±¨ÎIJ»ÔÙÊÇ´íÎóÐÅÏ¢¡£ÔÚ´ËʾÀýÖУ¬¾²Ä¬Í¨µÀ²¢²»ÊDZØÐèµÄ£¬µ«ÕâÈÃÎÒÃÇÁ˽âÁËÈçºÎʹÓÃËü¡£

    ÉèÖÃ×ÜÏß²ÎÊý

    ÓжàÖÖ·½·¨¿ÉÒÔÉèÖÃ×ÜÏßÉϵÄ×ÜÏß²ÎÊý¡£ÔÚ±¾Ö¸ÄÏÖУ¬ÎÒÃǽ«Ö»¹Ø×¢Ê¹ÓÃÔ¤¶¨Òå×ÜÏß²ÎÊýÀ´ÉèÖᢼì²éºÍ¸ü¸ÄͨµÀµÄCAN±ÈÌØÂÊ£¬ÓйØËùÓÐÔ¤¶¨Òå²ÎÊýµÄÁÐ±í£¬Çëתµ½ pycanlib.readthedocs canlib.canlib.Bitrate¡£ÒªÉèÖñÈÌØÂÊ£¬ÇëʹÓÃsetBusParams()ºÍcanlib.Bitrate.BITRATE_xK×÷ΪÊäÈ룬ÆäÖÐxÊÇËùÐèµÄ±ÈÌØÂÊ¡£ÔÚÉèÖñÈÌØÂÊ֮ǰ£¬ÎÒÃǽ«ÔÚ֮ǰʹÓÃgetBusParams()À´»ñÈ¡±ê×¼²ÎÊý£¬È»ºóÔÙʹÓÃgetBusParams()²é¿´²ÎÊýÊÇ·ñÒѸü¸Ä¡£

    Çë×¢Ò⣬·¢ËͺͽÓÊÕͨµÀ¶¼±ØÐëʹÓÃÏàͬµÄ±ÈÌØÂÊ¡£·ñÔò£¬ÎÒÃǽ«ÊÕµ½´íÎó±¨ÎÄ£¬ºìµÆ½«¿ªÊ¼ÉÁ˸¡£ÔÚÒÔÏÂʾÀý½Å±¾ÖУ¬ÎÒÃǽ«Ê¹Ó÷¢Ëͱ¨ÎÄʾÀý£¬Ìí¼ÓsetBusParamsº¯Êý²¢µ÷ÓÃËüchange_bitrate¡£

    # change_bitrate
    from canlib import canlib, Frame
    
    ch_a = canlib.openChannel(channel=0)
    ch_b = canlib.openChannel(channel=1)
    
    # Use getBusParams and print the result to see the preset parameters on both
    # channels.
    print(ch_a.getBusParams())
    print(ch_b.getBusParams())
    
    # After opening both channels we will call upon the setBusParams to change the
    # bitrate of the message. From the list of predefined we will use BITRATE_100K
    ch_a.setBusParams(canlib.Bitrate.BITRATE_100K)
    ch_b.setBusParams(canlib.Bitrate.BITRATE_100K)
    
    # Use getBusParams and print the result to see that the parameters changed on
    # both channels.
    print(ch_a.getBusParams())
    print(ch_b.getBusParams())
    
    ch_a.busOn()
    ch_b.busOn()
    
    frame = Frame(id_=123, data=[72, 69, 76, 76, 79, 33])
    ch_a.write(frame)
    
    msg = ch_b.read(timeout=500)
    print(msg)
    
    ch_a.busOff()
    ch_b.busOff()
    
    ch_a.close()
    ch_b.close()

    ÔÚÐéÄâ»·¾³ÖÐÆô¶¯´Ë½Å±¾½«³öÏÖÒÔϽá¹û£º

    	> .\.venv\Scripts\activate
    	(pyproj)> py change_bitrate.py
    	(500000, 4, 3, 1, 1, 1)
    	(500000, 4, 3, 1, 1, 1)
    	(100000, 11, 4, 1, 3, 1)
    	(100000, 11, 4, 1, 3, 1)
    	Frame(id=123, data=bytearray(b'HELLO!'), dlc=6, flags=<MessageFlag.STD: 2>, timestamp=3)

    ÎÒÃÇÏÖÔÚ¿ÉÒÔÇå³þµØ¿´µ½£¬Á½¸öͨµÀÔÚ¸ü¸Ä֮ǰ¾ßÓÐÏàͬµÄÔ¤Éè²ÎÊý£¬È»ºóÔÚ¸ü¸ÄÖ®ºóÈÔÈ»¾ßÓÐÏàͬµÄ²ÎÊý¡£Í¨³£Çé¿öÏ£¬±ÈÌØÂʲ»»á¸ü¸Ä£¬Òò´Ë×÷Ϊ¿ì½Ý·½Ê½£¬¿ÉÒÔÔÚµ÷ÓÃopenChannelʱÉèÖñÈÌØÂÊ£¬ÈçÏÂËùʾ£º

    ch_a = canlib.openChannel(channel=2, bitrate=canlib.Bitrate.BITRATE_100K)
    

    LED

    ËùÓÐÔÆº£ÓÎϷͨѶÒǶ¼ÓÐLED£¬ÓÃÓÚָʾͨѶÒÇÊÇÕý³£¹¤×÷»¹ÊdzöÏÖ´íÎó¡£ÎÒÃÇ¿ÉÒÔʹÓÃflashLedsºÍ²»Í¬µÄ²Ù×÷ºÍLEDÀ´²âÊÔÕâЩLED¡£²Ù×÷°üÀ¨´ò¿ªºÍ¹Ø±ÕËùÓÐLED»ò´ò¿ª»ò¹Ø±ÕËùÓÐLED¡£ÓйؿÉÓòÙ×÷µÄÍêÕûÁÐ±í£¬ÇëǰÍùpycanlib.readthedocs canlib.canlic.LEDAction¡£Çë×¢Ò⣬²¢·ÇËùÓвÙ×÷¶¼ÊÊÓÃÓÚËùÓÐÔÆº£ÓÎϷͨѶÒÇ£¬ÒòΪÕâЩͨѶÒǾßÓв»Í¬ÊýÁ¿µÄLEDºÍͨµÀ¡£ÎÒÃǽ«Ê¹ÓÃÔÆº£ÓÎÏ· USBcan pro 2xHS v2À´²âÊÔflashLeds£¬Ê¹ÓÃpython½âÊÍÆ÷ÔËÐÐÒÔÏÂÃüÁÔÚÖ´ÐÐflashLedÃüÁîʱ£¬ÇëÈ·±£Í¬Ê±²é¿´CANͨѶÒǵÄLED£©£º

    	> .\.venv\Scripts\activate
    	(pyproj)> py
    	Python 3.9.5 (tags/v3.9.5:0a7dcbd, May  3 2021, 17:27:52) [MSC v.1928 64 bit (AMD64)] on win32
    	Type "help", "copyright", "credits" or "license" for more information.
    	>>> from canlib import canlib
    	>>> ch = canlib.openChannel(channel=0)
    	>>> ch.flashleds(canlib.LEDAction.ALL_LEDS_ON, 10000)
    	>>> ch.flashleds(canlib.LEDAction.ALL_LEDS_OFF, 10000)
    

    ÔÚÉÏÃæµÄ´úÂëÖУ¬ÎÒÃÇÖ´ÐÐÁ˲Ù×÷0ºÍ1¡£²Ù×÷0ÊÇ´ò¿ªËùÓÐLED£¬¶ø²Ù×÷1ÊǹرÕËùÓÐLED¡£LED¡°ÉÁ˸¡±¶à³¤Ê±¼äÈ¡¾öÓÚµÚ¶þ¸öÕûÊý¡£ÔÚ±¾ÀýÖУ¬10000£¬±íʾ10000ºÁÃ룬¼´10Ãë¡£ÕâÈÃÎÒÃÇÓÐ×ã¹»µÄʱ¼äÇå³þµØ¿´µ½LEDÊÇ·ñÕý³£¹¤×÷¡£

    ½ÓÏÂÀ´£¬ÎÒÃǽ«Ò»´Î´ò¿ªÒ»¸öLED¡£ÕâÑù£¬ÎÒÃǾͿÉÒÔ¿´µ½£¬Ã¿¸öLEDµÄ¡°¿×¡±¶¼ÓÐÁ½¸ö²»Í¬ÑÕÉ«µÄLED¡£ÔÚÏÂͼÖУ¬ÎÒÃÇ¿ÉÒÔ¿´µ½²»Í¬µÄLED£¨°×É«µÄ£©ÔÚ¸Ç×ÓÄڵĵç·°åÉÏÊÇʲôÑù×ӵġ£

    ÔÚÔÆº£ÓÎÏ· CANͨѶÒǵÄÄÚ²¿£¬ÎÒÃÇ¿ÉÒÔ¿´µ½¸ÃÌØ¶¨Í¨Ñ¶ÒÇÉϵÄÁù¸öLED£¬¸ÃͨѶÒÇÓÐÁ½¸öͨµÀ£¨Ã¿¸öͨµÀÓÐÁ½¸öLED¶ÔºÍÁ½¸öPWR LED£©¡£Ã¿¸öLEDµÄÖ¸¶¨±àºÅÈçͼËùʾ¡£

    ÔÚ±¾ÀýÖУ¬ÎÒÃǽ«´ò¿ªLED 2ºÍ3£¬ÕâÊÇCAN 1µÄÁ½¸öLED£¬ÕâÁ½¸öLEDÊÇLED 2ºÍ3£¬ÑÕÉ«·Ö±ðΪºìÉ«ºÍ»ÆÉ«¡£ÔÚPython½âÊÍÆ÷ÖÐʹÓÃÒÔÏ´úÂ룺

    	>>> ch.flashLeds(canlib.LEDAction.LED_2_ON, 10000)
    	>>> ch.flashLeds(canlib.LEDAction.LED_3_ON, 10000)
    

    Èç¹ûÎÒÃÇʹÓÃPWRµÄLED£¬ÑÕÉ«½«ÊÇÂÌÉ«ºÍ»ÆÉ«£¨·Ö±ðΪLED_0_ONºÍLED_1_ON£©¡£

    ²éÕÒÉ豸

    ÔÚcanlibÖÐÓÐÒ»¸öÃûΪ¡°Device¡±µÄÀà±ð£¬¿ÉÒÔÓÃÀ´²éÕҺ͸ú×ÙÎïÀíÉ豸¡£DeviceÀà±ð±íʾһ¸öÎïÀíÉ豸£¬ÎÞÂÛËüµ±Ç°ÊÇ·ñÁ¬½Ó£¬ÒÔ¼°Á¬½ÓÔÚÄĸöͨµÀÉÏ¡£Èç¹ûÉ豸ÒÑÁ¬½Ó£¬ÇëʹÓÃDevice.findÀ´²éÕÒÉ豸²¢»ñÈ¡É豸¶ÔÏó¡£ÒªËÑË÷É豸£¬¿ÉÒÔʹÓÃEANºÍÐòÁкš£´ò¿ªÐéÄâ»·¾³£¬Æô¶¯python½âÊÍÆ÷£¬²¢ÔËÐÐÒÔÏÂÃüÁ

    	> .\.venv\Scripts\activate
    	(pyproj)> py
    	>>> from canlib import Device, EAN
    	>>> Device.find(ean=EAN('73-30130-00752-9'))
    	Device(ean=<EAN: 73-30130-00752-9>, serial=13406)
    	>>> Device.find(serial=13406)
    	Device(ean=<EAN: 73-30130-00752-9>, serial=13406)

    Device.find½«ËÑË÷²¢·µ»ØÓëÊäÈë²ÎÊýÆ¥ÅäµÄµÚÒ»¸öÉ豸¡£ÔÚÇ°ÃæµÄʾÀýÖУ¬ÎÒÃÇËÑË÷ÁËEANΪ73-30130-00752-9ºÍÐòÁкÅΪ13406µÄµÚÒ»¸öÉ豸¡£

    Èç¹ûÏëÒªµÄÉ豸µ±Ç°Î´Á¬½Ó£¬¿ÉÒÔʹÓÃÆäEANºÍÐòÁкţ¨Î¨Ò»±êÊ¶ÌØ¶¨É豸ËùÐèµÄ×îСÐÅÏ¢£©´´½¨É豸¶ÔÏó¡£¶ÔÓÚEAN±àºÅ£¬Ö»ÐèÒª×îºóÁù¸öÊý×Ö£¬ÒòΪǰÆß¸öÊÇĬÈϵģ¬ÔÚËùÓÐͨѶÒÇÉ϶¼ÊÇÏàͬµÄ¡£Òª´´½¨É豸£¬ÇëÔÚpython½âÊÍÆ÷ÖÐÔËÐÐÒÔÏ´úÂ룺

    	>>> dev = Device(ean=EAN('67890-1'), serial=42)

    ´´½¨ÐÂÉ豸²¢Í¨¹ýUSBÁ¬½Óµ½¼ÆËã»úºó£¬ÎÒÃÇ¿ÉÒÔʹÓÃprobe_info»ñÈ¡Æä£¨»òÈÎºÎÆäËûÉ豸£©ÐÅÏ¢£º

    	>>> print(dev.probe_info())
    	CANlib Channel: 2
    	Card Number   : 0
    	Device        : ÔÆº£ÓÎÏ· USBcan Pro 2xHS v2 (channel 0)
    	Driver Name   : kcany0a
    	EAN           : 73-30130-00752-9
    	Firmware      : 3.25.0.753
    	Serial Number : 13406

    Device.find»¹¿ÉÒÔÓÃÓÚ´ò¿ªÌض¨Á¬½ÓͨѶÒÇÉϵÄͨµÀ£¬¶ø²»¹ÜËü±»·ÖÅäÔÚÄĸöCANlibͨµÀºÅÉÏ¡£Îª´Ë£¬Çëµ÷ÓÃDevice.findÈ»ºóopen_channel¡£Õ⽫×Ô¶¯´ò¿ªÍ¨Ñ¶ÒÇÉϵĵÚÒ»¸ö±¾µØÍ¨µÀ£º

    	>>> dev = Device.find(ean=EAN(‘00752-9’))
    	>>> ch = dev.open_channel()

    ÏÖÔÚ£¬¿ÉÒÔÏñʹÓÃcanlib.openChannel(channel=x)´ò¿ªµÄÈÎºÎÆäËûͨµÀÒ»ÑùʹÓÃCh¡£

    ´ò¿ªÍ¨µÀʱ£¬ÎÒÃÇ¿ÉÒÔͬʱָ¶¨Í¨Ñ¶ÒÇÉÏҪʹÓõÄͨµÀ¡£ÕâÊÇͨ¹ýchan_no_on_cardÍê³ÉµÄ£¬ËüÖ¸¶¨ÁËͨѶÒÇÉϵı¾µØÍ¨µÀ¡£È·±£chan_no_on_cardÕûÊýСÓÚͨѶÒÇÉÏCANµÄÊýÁ¿£¨Èç¹ûÓÐÁ½¸öͨµÀ£¬ÔòÕûÊýӦΪ0»ò1£©¡£

    	>>> ch = dev.open_channel(chan_no_on_card=1)

    ×îºóÒ»²½ÊÇÔÚ´ò¿ªÍ¨µÀµÄͬʱÉèÖñÈÌØÂÊ¡£

    	>>> ch = dev.open_channel(chan_no_on_card=1, bitrate=canlib.Bitrate.BITRATE_100K)

    ͨµÀºÍ´¦ÀíÊý¾Ý

    Probe_info¿ÉÒÔÔÚÉ豸¶ÔÏóÉÏÓÃÓÚ»ñÈ¡ÓйØÁ¬½ÓͨѶÒǵÄÐÅÏ¢¡£Probe_infoʹÓÃChannelDataº¯Êý£¬ÎÒÃÇ¿ÉÒÔÖ±½ÓʹÓÃChannelDataº¯Êý£¬¾ÍÏñÔÚcheck_ch½Å±¾ÖÐËù×öµÄÄÇÑù¡£³ýÁËChannelData£¬ÎÒÃÇ»¹¿ÉÒÔʹÓÃÁíÍâÁ½ÖÖ·½·¨À´»ñÈ¡ÓйØÉ豸»òͨѶÒǵÄÐÅÏ¢¡£

    ÎÒÃÇ¿ÉÒÔʹÓõĵÚÒ»ÖÖ»ñȡͨµÀÊý¾ÝµÄ·½·¨ÊÇʹÓÃcanlib.ChannelData(x)£¬ÆäÖÐxÊÇÎÒÃÇÏëÒª»ñÈ¡Êý¾ÝµÄͨµÀ¡£ÒªÔËÐдËÃüÁÎÒÃÇÐèÒªÔÚÆô¶¯ChannelData֮ǰÆô¶¯ÐéÄâ»·¾³ºÍpython½âÊÍÆ÷¡£ÔÚ´ËʾÀýÖУ¬ÎÒÃǽ«´ÓͨµÀ0»ñÈ¡Êý¾Ý£º

    	> .\.venv\Scripts\activate
    	(pyproj)> py
    	Python 3.9.5 (tags/v3.9.5:0a7dcbd, May  3 2021, 17:27:52) [MSC v.1928 64 bit (AMD64)] on win32
    	Type "help", "copyright", "credits" or "license" for more information.
    	>>> from canlib import canlib
    	>>> dat = canlib.ChannelData(0)
    

    ÔÚÊý¾Ý¶ÔÏó´´½¨²¢ÃüÃûΪdatÖ®ºó£¬ÎÒÃÇ¿ÉÒÔʹÓÃËü´ÓchanneldataÖлñµÃÈκÎÎÒÃÇÏëÒªµÄÐÅÏ¢¡£ÓйؿÉÓÃÊý¾ÝµÄÍêÕûÁÐ±í£¬Çëתµ½pycanlib readthedocs canlib.canlib.ChannelData¡£

    È»¶ø£¬Ê¹ÓÃcanlib.ChannelDataÐèÒªÎÒÃÇÖªµÀͨѶÒÇÁ¬½Óµ½ÄĸöͨµÀ¡£Õâ¿ÉÄÜ»á±äµÃÂé·³£¬ÒòΪÔÚɾ³ýºÍ²åÈëͨѶÒÇʱ£¬ËüÃǺܿÉÄÜ»á¸ü¸ÄͨµÀºÅ¡£Òò´Ë£¬Èç¹û²»ÖªµÀͨµÀ£¬¾ÍÎÞ·¨Ê¹ÓÃChannelData¡£Ïà·´£¬»¹ÓÐÁ½ÖÖÆäËû·½·¨¿ÉÒÔ»ñÈ¡Êý¾Ý¶ÔÏó¡£Ò»ÖÖ·½·¨ÊDzéÕÒ»ò´´½¨ÃûΪdevµÄÉ豸£¬²¢Ê¹ÓÃdev.channel_dev()£¬ÁíÒ»ÖÖ·½·¨ÊÇ´ò¿ªÒ»¸öͨµÀ²¢Ê¹ÓÃch.channel_data()¡£ÕâÁ½ÖÖ·½·¨¶¼Ê¹ÓÃPython½âÊÍÆ÷£º

    	>>> dev = Device.find(ean=EAN(‘00752-9’))
    	>>> dat = dev.channel_data()
    
    	>>> ch = canlib.openChannel(channel=0) 
    	>>> dat = ch.channel_data()

    ÔÚÕâÁ½ÖÖÑ¡ÏîÖУ¬dev.channelʼÖÕÊÇÕýÈ·µÄ£¬Ò²ÊÇ×îÈÝÒ×ʹÓõġ£Í¨¹ýopenChannel»ñÈ¡datµÄ½á¹ûÓë֮ǰʹÓõÄcheck_ch.py½Å±¾Ïàͬ¡£

    ö¾Ù

    Ò»µ©ÎÒÃǵ¼ÈëÁËcanlib.canlib£¬Ëü»áö¾ÙÁ¬½ÓµÄÔÆº£ÓÎÏ· CANÉ豸£¬ÎÒÃÇ¿ÉÒÔµ÷ÓÃgetNumberOfChannelsÀ´»ñȡϵͳÖÐö¾ÙͨµÀµÄÊýÁ¿¡£Èç¹ûÎÒÃÇÔÚÔËÐгÌÐòʱͬʱÁ¬½ÓºÍ¶Ï¿ªÍ¨Ñ¶ÒÇ£¬¿ÉÄÜ»á³öÏÖÎÊÌâ¡£ÔÚ³ÌÐòÄÚ²¿£¬ÎÒÃÇÔÚÒýÓÃCANͨµÀºÍͨѶÒÇʱʹÓÃͨµÀ¡£µ«Èç¹ûÎÒÃÇÔÚ³ÌÐòÔËÐÐʱÌí¼Ó»òɾ³ý??ÈκÎͨѶÒÇ£¬ÕâЩ¸ü¸Ä²»»áÓ°Ïì³ÌÐò¡£»òÕߣ¬ÔÚÒýÓÃij¸öͨµÀʱʹÓÃÁË´íÎóµÄͨѶÒÇ¡£Çë×¢Ò⣬ֻÓÐÔÚ´úÂëÔËÐÐÆÚ¼ä²»¶ÏÁ¬½ÓºÍ¶Ï¿ªÉ豸ʱ£¬²ÅÐèÒªÖ´ÐÐÒÔϲÙ×÷¡£

    ΪÁ˽â¾öÕâ¸öÎÊÌ⣬ÎÒÃǽ«ÊÖ¶¯Ã¶¾Ù¿ÉÓõÄCANͨµÀ¡£¸Ãº¯ÊýÊÇcanlib.enumerate_hardware£¬ÓÃÓÚ¸ù¾Ýµ±Ç°Á¬½ÓµÄËùÓÐÉ豸´´½¨Ò»×éȫеÄCANlibͨµÀ±àºÅ¡£µ±Ç°´ò¿ªµÄͨµÀ¾ä±úÈÔÈ»ÓÐЧ¿ÉÓᣵ«ÊÇ£¬Ê¹Óô˺¯Êýʱ£¬ÎÒÃÇÐèҪֹͣ¸ù¾ÝCANlibͨµÀºÅÒýÓÃÉ豸£¬¶ø¸ÄΪʹÓÃͨµÀÀà¡£ÒòΪÿ´Îµ÷ÓÃenumerate_hardwareʱ£¬Í¨µÀºÅ¶¼»á¸ü¸Ä¡£Ïà·´£¬Òª¼ìË÷ÓйØÌض¨Í¨µÀµÄÐÅÏ¢£¬ÇëʹÓÃChannel.channel_data¡£

    Ìí¼ÓÉ豸

    Èç¹ûÎÒÃÇÔÚ³ÌÐòÔËÐÐʱÁ¬½ÓÉ豸£¬³ÌÐò½«ÎÞ·¨Ê¶±ðÊÇ·ñÁ¬½ÓÁËÐÂÉ豸¡£ÎÒÃÇ¿ÉÒÔͨ¹ýÔÚÐéÄâ»·¾³ºÍPython½âÊÍÆ÷ÄÚʹÓÃcanlib.getNumberOfChannelsÀ´¿´µ½ÕâÒ»µã£¨ÔÚ´ËʾÀýÖУ¬ÎÒÃÇÁ¬½ÓÁËÒ»¸öUSBcan²¢½«Á¬½ÓÒ»¸öleaflight£©£º

    	> .\.venv\Scripts\activate
    	(pyproj)> py
    	Python 3.9.5 (tags/v3.9.5:0a7dcbd, May  3 2021, 17:27:52) [MSC v.1928 64 bit (AMD64)] on win32
    	Type "help", "copyright", "credits" or "license" for more information.
    	>>> from canlib import canlib
    	>>> canlib.getNumberOfChannels()
    	4

    ½ÓÏÂÀ´Á¬½Óleaflight²¢ÔÙ´ÎÔËÐÐgetNumberOfChannels£º

    	>>> canlib.getNumberOfChannels()
    	4

    Èç¹ûÎÒÃÇÏÖÔÚÊÖ¶¯ÔËÐÐenumerate_hardware£¬È»ºóÔËÐÐgetNumberOfChannels£¬ÎÒÃÇ»áµÃµ½£º

    	>>> canlib.enumerate_hardware
    	5
    	>>> canlib.getNumberOfChannels()
    	5

    ÏÖÔÚÎÒÃÇ¿ÉÒÔ¿´µ½£¬²»ÐèÒªÖØÐÂÆô¶¯³ÌÐò£¬ÐÂͨµÀÒѱ»Ê¶±ð²¢¿ÉÒÔʹÓá£

    ɾ³ýÉ豸

    Èç¹ûÎÒÃÇɾ³ýÒ»¸öÉ豸£¬½«»áÓöµ½Ò»Ð©ÎÊÌâ¡£Ê×ÏÈ£¬ÓëÁ¬½ÓÉ豸ʱһÑù£¬ÔÚÖØÐÂö¾ÙÁ¬½ÓµÄÉ豸£¨Ã¶¾ÙÒÑÔËÐУ©Ö®Ç°£¬³ÌÐò²»»áʶ±ðÒÑʹÓÃgetNumberOfChannelsɾ³ýµÄÉ豸£º

    	>>> canlib.getNumberOfChannels()
    	5
    	>>> canlib.enumerate_hardware
    	4
    	>>> canlib.getNumberOfChannels()
    	4

    Èç¹ûÔÚɾ³ýÉ豸֮ǰÒÑ´ò¿ªµ½É豸µÄͨµÀ£¬Ôò³ÌÐòÈÔÈ»»á³¢ÊÔʹÓóÌÐòÔËÐеÄÃüÁîÓëÉ豸½øÐн»»¥¡£ÔËÐÐÕâЩÃüÁîÖеĴó¶àÊý¶¼»áµ¼Ö´íÎ󣬵«Ò²ÓÐһЩÃüÁîÈÔÈ»ÓÐЧ¡£ÎªÁËÏÔʾÕâÒ»µã£¬ÎÒÃÇÏÖÔÚ½«³¢ÊÔʹÓôò¿ªÍ¨µÀºóɾ³ýµÄͨѶÒǽøÐÐдÈëºÍ¶ÁÈ¡¡£ÔÚÔËÐжÁºÍдÃüÁî֮ǰ£¬ÐèÒªÔÚPython½âÊÍÆ÷ÖÐÔËÐÐÉèÖôúÂ룺

    	>>> from canlib import canlib, Frame
    	>>> ch_a = canlib.openChannel(0)
    	>>> ch_a.busOn()
    	>>> ch_b = canlib.openChannel(1)
    	>>> ch_b.busOn()
    	>>> frame = Frame(id_=123, data=[72, 69, 76, 76, 79, 33])

    Èç¹ûÏÖÔÚ¶Ï¿ªCANͨѶÒDz¢³¢ÊÔÓÃÆäÖÐÒ»¸öÒÑɾ³ýµÄͨµÀдÈëÖ¡£¬ÎÒÃǽ«µÃµ½Ó²¼þ´íÎóÒì³££º

    >>> ch_a.write(frame)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "C:\Users\extac\Pyproj\.venv\lib\site-packages\canlib\canlib\channel.py", line 718, in write
        dll.canWrite(self.handle, frame.id, bytes(frame.data), frame.dlc, frame.flags)
      File "C:\Users\extac\Pyproj\.venv\lib\site-packages\canlib\canlib\dll.py", line 177, in _error_check
        raise can_error(result)
    canlib.canlib.exceptions.CanGeneralError: A hardware error was detected (-15)

    Òª³¢ÊÔʹÓÃÒÑɾ³ýµÄͨµÀ¶ÁÈ¡±¨ÎÄ£¬ÎÒÃÇÐèÒªÔÚɾ³ýͨѶÒDz¢ÔËÐжÁÈ¡´úÂë֮ǰÔÙ´ÎÔËÐÐÉèÖôúÂë¡£

    >>> ch_a.read()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "C:\Users\extac\Pyproj\.venv\lib\site-packages\canlib\canlib\channel.py", line 718, in write
        dll.canWrite(self.handle, frame.id, bytes(frame.data), frame.dlc, frame.flags)
      File "C:\Users\extac\Pyproj\.venv\lib\site-packages\canlib\canlib\dll.py", line 177, in _error_check
        raise can_error(result)
    canlib.canlib.exceptions.CanGeneralError: A hardware error was detected (-15)

    µ±Äú²åÈëÐÂÉ豸ʱ£¬Èç¹ûÒѾ­Æô¶¯Á˳ÌÐò£¬¸ÃÉ豸½«²»»áÏÔʾ¡£

    ²»±ØÖØÐÂÆô¶¯£¬Ê¹ÓÃenumerate¡£

    Çë×¢ÒâCanlibͨµÀºÅ¡°Ìø¹ý¡±£¬µ«chÈÔÈ»ÓÐЧ¡£

    ×Ô¶¨ÒåͨµÀÃû³Æ

    µ±ÎÒÃÇʹÓöà¸öͨѶÒǺͶà¸öͨµÀʱ£¬¼Çסÿ¸öͨµÀ¶ÔÓ¦µÄÊÇʲô¿ÉÄÜ»á±äµÃÀ§ÄÑ¡£ÎªÁ˽â¾öÕâ¸öÎÊÌ⣬ÎÒÃÇ¿ÉÒÔΪͨµÀÖØÃüÃû²¢¸³ÓèËüÃÇ×Ô¶¨ÒåÃû³Æ¡£Òª¸øÍ¨µÀ×Ô¶¨ÒåÃû³Æ£¬ÎÒÃÇÐèҪʹÓÃÔÆº£ÓÎÏ·É豸ָÄÏ¡£ÔÚÔÆº£ÓÎÏ·É豸ָÄÏÖУ¬ÓÒ¼üµ¥»÷ÒªÓ¦ÓÃ×Ô¶¨ÒåÃû³ÆµÄͨµÀ£¬È»ºóµ¥»÷¡°Edit Channel Name£¨±à¼­Í¨µÀÃû³Æ£©¡±¡£Õâʱһ¸ö´°¿Ú»áµ¯³ö£¬Äú¿ÉÒÔÔÚÆäÖÐÊäÈëͨµÀÃû³Æ£¬È»ºóµ¥»÷¡°ok¡±°´Å¥ÒÔÓ¦ÓÃÃû³Æ¡£ÒªÉ¾³ýÃû³Æ£¬Ö»ÐèÔٴδò¿ª¸ü¸ÄͨµÀÃû³Æ´°¿Ú²¢É¾³ý²åÈëµÄÃû³Æ¡£Çë×¢Ò⣬¸ü¸Ä½«Ó°ÏìËùÓÐʹÓÃͨµÀÃû³ÆÀ´Ê¶±ðÉ豸µÄ³ÌÐò¡£É豸Ҳ½«ÖØÐÂÆô¶¯ÒÔÉèÖÃÃû³Æ¡£

    ÏÂÒ»²½ÊÇ»ñÈ¡×Ô¶¨ÒåÃû³Æ²¢Í¨¹ýPythonʹÓÃËü¡£Òª»ñÈ¡Ãû³Æ£¬ÇëʹÓÃcanlib.getChannelData().custom_name¡£ÏÖÔÚ£¬ÎÒÃǽ«´´½¨Ò»¸öÃûΪget_cus_name.pyµÄ½Å±¾£¬ÒÔ»ñÈ¡ËùÓÐÁ¬½ÓÉ豸µÄ×Ô¶¨ÒåÃû³Æ¡£Ôڽű¾ÖÐдÈëÒÔÏ´úÂ룺

    # get_cus_name.py
    from canlib import canlib
    
    num_channels = canlib.getNumberOfChannels()
    for ch in range(num_channels):
        chd = canlib.ChannelData(ch)
        print(f"{ch}. {chd.channel_name}, Custom name: {chd.custom_name}")

    Èç¹û°²×°ÁËÔÆº£ÓÎÏ· USBcan£¬²¢ÇÒͨµÀ0¾ßÓÐ×Ô¶¨ÒåÃû³Æ¡°Green¡±£¬Í¨µÀ1¾ßÓÐ×Ô¶¨ÒåÃû³Æ¡°Red¡±£¬Ôò½«²úÉúÒÔϽá¹û£º

    0. ÔÆº£ÓÎÏ· USBcan Pro 2xHS v2 (channel 0), Custom name: Green
    1. ÔÆº£ÓÎÏ· USBcan Pro 2xHS v2 (channel 1), Custom name: Red
    2. ÔÆº£ÓÎÏ· Virtual CAN Driver (channel 0), Custom name:
    3. ÔÆº£ÓÎÏ· Virtual CAN Driver (channel 1), Custom name:

    ÎÒÃÇ»¹¿ÉÒÔʹÓÃ×Ô¶¨ÒåÃû³ÆÀ´´ò¿ªÌض¨µÄͨµÀ¡£ÒªÖ´Ðд˲Ù×÷£¬Çë±àдÒÔÏÂÃûΪopen_channel_by_nameµÄ½Å±¾£¬ÆäÖн«°üÀ¨Í¬Ãûº¯ÊýÒÔ¼°ÓÃÓÚÈ·±£ÆäÕý³£¹¤×÷µÄ²âÊÔ¡£Ôڴ˲âÊÔÖУ¬ÎÒÃÇÓÐÒ»¸ö¾ßÓÐ×Ô¶¨ÒåÃû³Æ¡°USBone¡±µÄÔÆº£ÓÎÏ· USBcan£¬ÒÔ¼°Ò»¸ö¾ßÓÐ×Ô¶¨ÒåÃû³Æ¡°My leaf¡±µÄleaflight¡£Ôڽű¾ÖÐдÈëÒÔÏ´úÂ룺

    #open__channel_by_name
    from canlib import canlib, Frame
    
    
    # The function we will use to open a channel using the custom channel name.
    # The custom name will be sent in as an input.
    def open_channel_by_name(cust_name):
    # Firstly, using a for-loop will be used to go through every connected device.
        num_channels = canlib.getNumberOfChannels()
        for i in range(num_channels):
            chd = canlib.ChannelData(i)
    # For every device connected their custom name is compared to the input name.
    # If the names are the same, the channel is opened and named ch.
            if cust_name == chd.custom_name:
                ch = canlib.openChannel(i)
                break
    # If we do not find a channel with the input name as a custom name, the
    # following message is shown and the exception CanNotFound is raised.
        else:
            print(f"Channel with custom name {cust_name} not found”)
            raise canlib.CanNotFound
    # The opened channel named ch is returned by the function.
        return ch
    
    # We will now test the function by opening two channels using their custom
    # name and sending a message between them. THe channels we will try to open is
    # the first channel on a USBcan with the custom name USBone and the channel on
    # a leaflight with the name My Leaf. The channels will be named ch_b and ch_a
    # respectively.
    ch_b = open_channel_by_name("My Leaf”)
    ch_a = open_channel_by_name(“USBone")
    ch_a.busOn()
    ch_b.busOn()
    frame = Frame(id_=123, data=[72, 69, 76, 76, 79, 33])
    ch_a.write(frame)
    msg = ch_b.read()
    print(msg)
    ch_a.close()
    ch_b.close()
    # After successfully sending a message we will see what happens when we try to
    # open a channel with a custom name that does not exist.
    ch_a = open_channel_by_name("USBoe")

    »ù±¾´íÎóµÄ¹ÊÕÏÅųý

    ÔÚʹÓÃPython canlibºÍCANͨѶÒÇʱ£¬ÎÒÃÇ¿ÉÄÜ»áÓöµ½¶àÖÖ´íÎóºÍÎÊÌâ¡£ÏÖÔÚ£¬ÎÒÃǽ«ÌÖÂÛһЩ³£¼ûµÄ´íÎó±¨ÎĺÍÎÊÌ⣺

    • ºìÉ«ÉÁ˸µÆ£º¿ìËÙÉÁ˸µÄºìÉ«CANµÆ±íʾ½ÓÊÕµ½Á˶à¸ö´íÎóÖ¡£¬ÕâÒâζ×ÅÔÚ±¨ÎÄ´«Êä¹ý³ÌÖпÉÄÜ·¢ÉúÁËÎÊÌâ¡£¿ÉÄܳöÏÖµÄÈýÖÖÎÊÌâÊÇ£º
    1. Ö»ÓÐÒ»¸öͨµÀÁ¬½Óµ½CAN×ÜÏߣ¨Á¬½Óµ½T-cannector£©¡£
    2. Ö»ÓÐÒ»¸öͨµÀ´¦ÓÚ×ÜÏß¿ªÆô״̬£¨¸ÃͨµÀÒѾ­Ö´ÐÐbusOn()£©¡£
    3. ½ÓÊÕ»ò´«Êä×ÜÏß´¦ÓÚ¾²Ä¬Ä£Ê½¡£

    Òª½â¾ö´ËÎÊÌ⣬Ê×ÏȹرսÓÊÕµ½´íÎóÐÅÏ¢µÄͨµÀµÄ×ÜÏߣ¬ÒÔʹºìµÆÍ£Ö¹ÉÁ˸¡£È»ºóÈ·±£ÖÁÉÙÓÐÁ½¸öͨµÀÁ¬½Óµ½T-cannector£¬²¢ÔÚ×ÜÏßÉÏ´¦ÓÚÕý³£Ä£Ê½£¬Ò»¸öÓÃÓÚ·¢Ëͱ¨ÎÄ£¬Ò»¸öÓÃÓÚ½ÓÊÕ±¨ÎÄ¡£

    • ûÓпÉÓñ¨ÎÄ£¨-2£©£ºµ±ÎÒÃÇÔÚûÓз¢Ëͱ¨ÎÄ»ò·¢Ëͱ¨Îijö´íµÄÇé¿öϵ÷ÓÃread()ʱ£¬»á·¢Éú´Ë´íÎó£¬ÀýÈ磬ÒòΪËüµÄ±ÈÌØÂʲ»ÕýÈ·¡£Õâ¿ÉÄÜÊÇÒòΪwrite()δ±»µ÷Óûò´«ÊäͨµÀ´¦ÓÚ¾²Ä¬Ä£Ê½£¬µ¼Ö±¨ÎÄδ·¢ËÍ¡£Òª½â¾ö´ËÎÊÌ⣬ÇëÈ·±£ÒÑʹÓÃÖ¡ÕýÈ·µ÷ÓÃÁËwrite()¡¢´«ÊäͨµÀ´¦ÓÚÕý³£Ä£Ê½£¬²¢ÇÒ±ÈÌØÂÊÓë½ÓÊÕͨµÀʹÓõıÈÌØÂÊÏàͬ¡£
    • ´«Ê仺³åÇøÒç³ö£¨-13£©£ºµ±ÎÒÃÇÊÔͼ·¢ËÍÐí¶àÐÅÏ¢µ«È«²¿Ê§°Üʱ£¬ÕâЩÐÅÏ¢½«ÔÚ´«Ê仺³åÇøÖС°ÅŶӡ±¡£Õ⽫µ¼ÖÂÒÔºóµÄËùÓб¨ÎÄÒ²·¢ËÍʧ°Ü£¬¾¡¹Ü·¢ËÍÊÇÕýÈ·µÄ¡£Èç¹ûͨµÀ´¦ÓÚ×ÜÏßÉÏ£¬LED½«¿ªÊ¼ÉÁ˸ºìÉ«¡£Õâ¿ÉÄÜÊÇÒòΪʹÓþ²Ä¬É豸·¢ËÍÁËÐí¶à±¨ÎÄ»òʹÓò»ÔÚ×ÜÏßÉϵÄÉ豸·¢ËÍÁ˱¨ÎÄ¡£Èç¹ûͨµÀÔÚ×ÜÏßÉϵ«ÊǾ²Ä¬µÄ£¬ºìµÆ»á¿ªÊ¼ÉÁ˸¡£Òª½â¾ö´ËÎÊÌ⣬Ê×ÏÈͨ¹ý¹Ø±Õ×ÜÏßÔÙ´ò¿ª×ÜÏßÀ´Çå³ý´«Ê仺³åÇø£¨»¹¿ÉÒÔ½«É豸¶Ï¿ªÁ¬½Ó²¢ÖØÐÂÁ¬½Óµ½¼ÆËã»ú£©¡£Èç¹ûÕâ²»Äܽâ¾öÎÊÌ⣬ÇëÈ·±£ËùÓÐ×ÜÏß¶¼´¦ÓÚ×ÜÏßÉÏ£¬¿ÉÒÔʹÓÃ.busOn»òÕß¼ì²éͨѶÒÇÊÇ·ñÁ¬½Óµ½T-cannectorÉÏ¡£
    • ¼ì²âµ½Ó²¼þ´íÎó£¨-15£©£ºÈç¹ûÎÒÃdz¢ÊÔÓëδÁ¬½ÓµÄÉ豸½»»¥£¬½«ÊÕµ½´Ë´íÎó֪ͨ¡£×îÓпÉÄܵÄÇé¿öÊÇÉ豸δͨ¹ýUSBÁ¬½Ó£¬³ÌÐòÆô¶¯ºó±»ÒƳý£¬»òÕßijÐдúÂëÔÚij´¦µ÷ÓÃÁË´íÎóµÄÉ豸¡£Òª½â¾ö´ËÎÊÌ⣬Çë×Ðϸ¼ì²éËùÓÐÉ豸ÊÇ·ñͨ¹ýUSBÁ¬½Ó£¬Èç¹û»¹²»ÐУ¬Çë×Ðϸ¼ì²éÓÃÓÚʶ±ðÉ豸µÄËùÓдúÂë¡£
    • ·¢Éú³¬Ê±£¨-7£©£º³¬Ê±Êǵ±Óû§ÉèÖóÌÐòµÈ´ýij¸öʼþ·¢ÉúµÄ³¬Ê±ÏÞÖÆÊ±Òý·¢µÄ´íÎó¡£Èç¹ûµÈ´ýʱ¼äÌ«³¤£¬½«Òý·¢´íÎó£¬ÎÒÃǾͻáÖªµÀ³öÁËÎÊÌâ¡£Òª½â¾öÕâ¸öÎÊÌ⣬ÎÒÃÇÐèÒª×Ðϸ¼ì²é´úÂëÒÔÕÒµ½ÎÊÌâ¡£ÎÊÌâ¿ÉÄÜÊÇдÈëͨµÀ²»ÔÚ×ÜÏßÉÏ»ò´¦ÓÚ¾²Ä¬Ä£Ê½¡£

    »ñÈ¡ÐÅÏ¢µÄ;¾¶

    ÓжàÖÖ·½Ê½¿ÉÒÔ»ñÈ¡ÓйØCANlibµÄÐÅÏ¢¡£ÓйØcanlibºÍÓëcanlibÒ»ÆðʹÓõÄÃüÁîµÄ×î¼ÑÐÅÏ¢À´Ô´ÊÇpycanlib.readthedocs.io¡£Èç¹ûreadthedocsÎÞ·¨Õý³£¹¤×÷£¬ÄÇÃ´ÔÆº£ÓÎÏ·µÄÍøÕ¾ÔÆº£ÓÎÏ·.comÉÏÓжà¸ö²©¿Í½âÊÍÁËcanlibµÄ²»Í¬·½Ãæ¡£ÔÚÔÆº£ÓÎÏ·ÍøÕ¾ÉÏ£¬ÎÒÃÇ»¹¿ÉÒÔÔÚÖ§³ÖÒ³ÃæºÍcanlibÍøÂç°ïÖúÖÐÕÒµ½¸ü¶àÐÅÏ¢£¬°üº¬¿ªÊ¼Ê¹ÓÃÔÆº£ÓÎÏ·Ó²¼þµÄ»ù±¾×ÊÔ´¡¢Óû§Ö¸ÄϵÈÎĵµ¡¢¿ª·¢Õß¹¤¾ßÒÔ¼°ÓÃÓÚ¼ÆËã±ÈÌØÂʵļÆËãÆ÷¡£Èç¹ûÄúûÓÐÕÒµ½ËùÐèÄÚÈÝ£¬Ç뽫ÄúµÄÎÊÌâºÍÒÉÎÊͨ¹ýµç×ÓÓʼþ·¢ËÍÖÁSUPPORT@KVASER.COM£¬ËæÊ±ÁªÏµÎÒÃÇ»ñµÃÖ§³Ö¡£

    ÀýÈ磬ÔÚÇ°ÃæµÄ½Å±¾ÖУ¬ÎÒÃÇÏëÒª¶ÁÈ¡±¨ÎÄ¡£µ«ÊÇÔÚ±¨Îı»ÕýÈ·½ÓÊպͶÁȡ֮ǰ£¬ÎÒÃDz»Ï£Íû¼ÌÐøÖ´ÐÐÏÂÒ»ÐС£´ËÍ⣬Èç¹ûÎÞ·¨¶ÁÈ¡±¨ÎÄ£¬ÎÒÃÇ»¹Ï£Íû³ÌÐòÍ£Ö¹²¢·µ»Ø´íÎó±¨ÎÄ¡£ÒªÕÒµ½ÊµÏÖÕâÒ»µãµÄ×î¼Ñ·½·¨£¬Çë²ÎÔÄpycanlib.readthedocsÉϵÄÎĵµ¡£

    ΪÁËÕÒµ½ÕýÈ·µÄÎĵµ£¬Ê×ÏÈÎÒÃÇÐèÒªÕ¹¿ª¡°Using canlib¡±Ñ¡Ï¡£ÏÂÒ»²½ÊÇÁ˽âʹÓ÷½Ê½ºÍÓÃ;¡£Ä¿Ç°£¬ÎÒÃÇÒª·¢ËÍÒ»Ìõ±¨ÎÄ£¬¸ÕºÃÓÐÒ»¸öÃûΪ¡°Send and Receive¡±µÄÑ¡Ï£¬ÎÒÃÇ¿ÉÒÔÕ¹¿ªËü¡£½ÓÏÂÀ´£¬ÎÒÃÇ¿´µ½¡°Reading Messages¡±Ò²ÊÇÒ»¸ö±êÌ⣬ÄÇôµã»÷Ëü£¬Ö±½Óתµ½¶ÁÈ¡±¨ÎÄ¡£ÔÚ¡°read¡±±êÌâÏÂÔĶÁʱ£¬ÎÒÃÇ×îÖջῴµ½Ò»ÏµÁй¦ÄÜÁбí¡£ÆäÖÐÒ»ÏÄÜÈçÏ£º¡°If you want to wait until a message arrives (or a timeout occurs) and then read it, call read with a timeout£¨Èç¹ûÒªµÈµ½±¨Îĵ½´ï£¨»ò·¢Éú³¬Ê±£©È»ºó¶ÁÈ¡Ëü£¬Çëµ÷ÓôøÓг¬Ê±µÄread£©¡±¡£Õâ¿´ÆðÀ´¾ÍÊÇÎÒÃÇËùÐèÒªµÄ¡£ÒªÁ˽â¸ü¶à¹ØÓڸú¯ÊýµÄÐÅÏ¢£¬ÎÒÃÇ¿ÉÒÔµ¥»÷±êÓС°read¡±µÄÁ´½ÓÖ±½Óתµ½¡°read¡±º¯Êý¡£ÏÖÔÚÎÒÃÇ¿ÉÒÔ¿´µ½¡°read¡±ÓÐÒ»¸öÃûΪ¡°timeout¡±µÄ²ÎÊý£¬ËüÊÇÒ»¸öÕûÊý¡£¸ÃÕûÊý¾ö¶¨³ÌÐòÔÚ·µ»Ø³¬Ê±´íÎó֮ǰµÈ´ý±¨ÎÄ´«µÝµÄºÁÃëÊý¡£ÏÖÔÚÎÒÃÇÒѾ­ÕÒµ½ÁËÎÒÃÇÒªÕÒµÄÄÚÈÝ£¬¿ÉÒÔ½«ÆäÊäÈëµ½ÎÒÃǵĴúÂëÖУ¬ÀýÈçchannel.read(timeout = 500)£¬ÒÔʹ³ÌÐòµÈ´ý500ºÁÃë¡£

    Author Image

    Anton Carlsson

    Anton CarlssonÊÇÔÆº£ÓÎÏ· ABµÄÒ»ÃûÈí¼þʵϰÉú¡£


    ¡¾ÍøÕ¾µØÍ¼¡¿¡¾sitemap¡¿