ÕâÊǵڶþƪ½éÉÜÔÆº£ÓÎÏ· 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µÆ±íʾ½ÓÊÕµ½Á˶à¸ö´íÎóÖ¡£¬ÕâÒâζ×ÅÔÚ±¨ÎÄ´«Êä¹ý³ÌÖпÉÄÜ·¢ÉúÁËÎÊÌâ¡£¿ÉÄܳöÏÖµÄÈýÖÖÎÊÌâÊÇ£º
- Ö»ÓÐÒ»¸öͨµÀÁ¬½Óµ½CAN×ÜÏߣ¨Á¬½Óµ½T-cannector£©¡£
- Ö»ÓÐÒ»¸öͨµÀ´¦ÓÚ×ÜÏß¿ªÆô״̬£¨¸ÃͨµÀÒѾִÐÐbusOn()£©¡£
- ½ÓÊÕ»ò´«Êä×ÜÏß´¦ÓÚ¾²Ä¬Ä£Ê½¡£
Òª½â¾ö´ËÎÊÌ⣬Ê×ÏȹرսÓÊÕµ½´íÎóÐÅÏ¢µÄͨµÀµÄ×ÜÏߣ¬ÒÔʹºìµÆÍ£Ö¹ÉÁ˸¡£È»ºóÈ·±£ÖÁÉÙÓÐÁ½¸öͨµÀÁ¬½Óµ½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ºÁÃë¡£