¼¼Êõ²©¿Í

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

KVASER CANlib Óë PythonµÚ1²¿·Ö£º³õʼÉèÖÃ

ÕâÊǽéÉÜÔÆº£ÓÎÏ· CANlib SDKºÍPython°ücanlibµÄÁ½ÆªÎÄÕµĵÚһƪ¡£

ÔÚÕⲿ·ÖÄÚÈÝÖУ¬ÎÒÃǽ«½éÉÜÈçºÎÀí½âºÍʹÓÃPython CANlib Wrapper¡£Õâ°üÀ¨ÏÂÔØËùÐèµÄÈí¼þ£¬Á¬½Ó±ØÒªµÄÓ²¼þÒÔ¼°ÔÚʹÓÃÔÆº£ÓÎϷͨѶÒÇ·¢Ëͱ¨ÎÄʱʹÓõĻù±¾±àÂë¡£

×÷ÕߣºAnton Carlsson£¬Èí¼þ¿ª·¢ÈËÔ±
¹²Í¬×÷ÕߣºL-G Fredriksson£¬ÏÖ³¡Ó¦Óù¤³Ìʦ

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

ͨ¹ýÕâ¸ö·Ö²½½Ì³Ì£¬ÎÒÃǽ«Ö¸µ¼ÄúÈçºÎʹÓÃPython¡¢Ôƺ£ÓÎÏ· CANͨѶÒÇÒÔ¼°Python package libÀ´·¢ËͺͽÓÊÕ±¨ÎÄ¡£Ôƺ£ÓÎÏ· CANlibÊÇÊÊÓÃÓÚËùÓÐÔÆº£ÓÎÏ· CANÓ²¼þµÄƽ̨£¬Ö§³Ö¿ØÖÆCANͨѶÒǵĴ󲿷ֹ¦ÄÜ¡£canlib°üÊÇÒ»¸öPython·â×°£¬ÔÊÐíÓû§Í¬Ê±Ê¹ÓÃÔÆº£ÓÎÏ· CANlibÓëPython¡£±¾Ö¸ÄϽöÏÞÓÚÔÆº£ÓÎÏ· CANlibÈí¼þÖ§³ÖµÄWindowsºÍLinuxϵͳ¡£

Óû§Í¨³£»áʹÓÃÃüÁîÐÐÓ¦ÓóÌÐò¡£ÔÚ±¾Ö¸ÄÏÖУ¬ÎÒÃǽ«Ê¹ÓÃWindows PowerShell£¬ËüÒÑĬÈϰ²×°ÔÚWindows 7 SP1ºÍWindows Server 2008 R2 SP1»òÈκθüа汾ÉÏ¡£Èç¹ûÄúÏëʹÓÃPowerShellÖ®ÍâµÄÆäËûÓ¦ÓóÌÐò£¬ÎÒÃÇÒ²±íʾ»¶Ó­¡£

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

±¾Ö¸ÄÏÃæÏòÄÇЩÏëÒªÉèÖúÍʹÓôøÓÐCANlibºÍPython CANlib°ü/·â×°µÄÔÆº£ÓÎÏ· CANͨѶÒǵÄÓû§¡£
ÔÚʹÓñ¾Ö¸ÄÏ֮ǰ£¬Óû§ÐèÒª¶ÔÏÂÊöÄÚÈÝÓÐЩÐíÁ˽⣨»òÄܹ»²éÔÄÒÔÏÂÄÚÈÝ£©£º

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

1 ΪCANlib×¼±¸Python

1.1 ËùÐèÓ²¼þ

ΪÁËÍê³É±¾Ö¸ÄϵĵÚÒ»²½£¬¼´·¢ËͺͽÓÊÕCAN±¨ÎÄ£¬ÎÒÃÇÐèÒªÓõ½ÒÔÏÂÓ²¼þ£º

  • һ̨װÓÐWindows»òLinux£¨¶ÔÓÚLinux£¬×îºÃÊÇUbuntu°æ±¾£©²Ù×÷ϵͳ£¨OS£©µÄ¼ÆËã»ú¡£
  • Á½¸öCANͨµÀ£¬ÎÒÃÇ¿ÉÒÔʹÓþßÓÐÁ½¸öͨµÀµÄCANͨѶÒÇ»ò·Ö±ð¾ßÓÐÒ»¸öͨµÀµÄÁ½¸öͨѶÒÇ¡£ÔÚ´Ë´¦£¬ÎÒ½«Ê¹ÓÃÔÆº£ÓÎÏ· USBcan Pro 2xHS v2£¨00752-9£©¡£
  • Èç¹ûûÓпÉÓÃͨѶÒÇ£¬¿ÉÒÔÔÚµÚÒ»²½ÖÐʹÓÃÐéÄâͨѶÒÇ¡£
  • ¶Ë½ÓÕýÈ·µÄCAN×ÜÏß¡£ÔÚ´Ë´¦£¬ÎÒ½«Ê¹ÓÃT-Connector v2£¨00776-5£©£¬²¢½«µç×èÉèÖÃΪ60Å·Ä·¡£
  • ¸ù¾Ý½«ÒªÓõ½µÄͨѶÒÇÊýÁ¿ºÍ¿ÉÓõÄUSB¶Ë¿Ú£¬¿ÉÄÜÐèÒªÒ»¸öUSB¼¯Ï߯÷½«ËùÓÐÉ豸Á¬½Óµ½¼ÆËã»úÉÏ¡£

1.2 ¸ü¸Ä¼ÆËã»ú²¢ÏÂÔØÈí¼þ

ÎÒÃÇÐèÒª¶Ô¼ÆËã»ú½øÐиü¸Ä²¢ÏÂÔØÈí¼þ¡£ÐèÒª¶Ô¼ÆËã»ú½øÐÐÒÔϸü¸Ä£º

  • Äú±ØÐë¾ßÓмÆËã»úµÄ¹ÜÀíԱȨÏÞ£¬ÒÔ±ã½øÐбØÒª¸ü¸Ä¡£
  • ×îа汾£¨»òÖÁÉÙ°æ±¾3.7ÒÔÉÏ£©µÄPython¡£
  • CANlibÈí¼þ¿ª·¢¹¤¾ß°üÈí¼þ¡£
  • ÔÆº£ÓÎÏ· CANlibÇý¶¯³ÌÐò¡£
  • ÈκÎ×îÖÕÎı¾±à¼­Æ÷£¨Idle»á×Ô¶¯ÓëPythonÒ»Æð°²×°£¬±¾Ö¸ÄÏÖн«Ö÷ҪʹÓÃËü£©¡£

1.3 Windows

Èç¹ûÄúʹÓõÄÊÇWindows²Ù×÷ϵͳ£¬Çë²é¿´ÒÔϲ¿·Ö£¬ÒÔÁ˽âÈçºÎΪWindowsÏÂÔØËùÐèµÄÈí¼þ¡£¶ÔÓÚLinux²Ù×÷ϵͳ£¬Çë²é¿´ÏÂÒ»²¿·Ö¡£

1.3.1 ÏÂÔØ²¢°²×°Python£¨Windows£©

µÚÒ»²½Êǰ²×°Python¡£¹ØÓÚPythonµÄÏêϸ°²×°Ö¸ÄÏ£¬Çë·ÃÎÊRealPython.com°²×°Python¡£ÒÔÏÂÊÇÔÚWindowsϵͳ°²×°PythonµÄ¼òҪ˵Ã÷£º

1.3.1.1 ¼ì²éPython°æ±¾£¨Windows£©

ÔÚ°²×°Python֮ǰ£¬Çë¼ì²éËüÊÇ·ñÒѰ²×°¡£´ò¿ªPowerShell£¨Í¨¹ýÑ¡Ôñwindows¼ü²¢ËÑË÷¡°powershell¡±£©£¬È»ºó¼üÈëÒÔÏÂÃüÁîÖ®Ò»£º

> py ¨Cversion

»ò

> py -V

£¨–versionºÍ-V¿É»¥»»Ê¹Óã©

Èç¹ûÒѾ­°²×°ÁËPython£¬Êä³ö½«ÏÔʾ£¨½ØÖÁ2021Äê6ÔÂ15ÈÕ£¬Python 3.9.5ÊÇ×îа汾£©£º

Python 3.9.5

Èç¹ûδ°²×°Python£¬ÔòÊä³ö½«ÀàËÆÓÚ£º

δÕÒµ½Python£»ÔÚûÓвÎÊýµÄÇé¿öÏÂÔËÐУ¬ÒÔ´ÓMicrosoftÓ¦ÓÃÉ̵갲װ£¬»ò´Ó¡°Settings£¨ÉèÖã©¡±>¡°Manage App Execution Aliases£¨¹ÜÀíÓ¦ÓÃÖ´ÐбðÃû£©¡±½ûÓô˿ì½Ý·½Ê½¡£

»ò

¡°Py¡±Î´±»Ê¶±ðΪÄÚ²¿»òÍⲿÃüÁî¡¢¿É²Ù×÷³ÌÐò»òÅú´¦ÀíÎļþ¡£

Èç¹ûδ°²×°Python»ò°²×°µÄ°æ±¾Ì«¾É£¬ÎÒÃÇÐèÒª°²×°Ð°汾¡£Èç¹ûÒѾ­°²×°Á˿ɽÓÊܵÄPython°æ±¾£¨3.7+£©£¬ÇëÌø¹ýÏÂÒ»²¿·Ö¡£

1.3.1.2 °²×°Python£¨Windows£©

ÎÒÃÇÐèÒªv3.7»ò¸ü¸ß°æ±¾µÄPython¡£ÔÚ±¾Ö¸ÄÏÖУ¬ÎÒÃǽ«Ö»Ì½ÌÖÒ»ÖÖPython°²×°·½·¨¡£

Ê×ÏÈÏÂÔØ°²×°³ÌÐò£¨ÓйØÔÚWindowsϵͳ°²×°PythonµÄ¸ü¶àÏêϸÐÅÏ¢£¬Çë·ÃÎÊrealpython.com£©£º

  1. ´ò¿ªPython.orgµÄwindowsÏÂÔØÒ³Ãæ¡£
  2. ÔÚ¡°Download the latest version for Windows£¨ÎªWindowsÏÂÔØ×îа汾£©¡±Ï£¬µã»÷ÏÂÔØPython°´Å¥£¬ÒÔÏÂÔØPythonµÄ×îа汾¡£

µ±°²×°³ÌÐòÏÂÔØÍê³Éºó£¬Ë«»÷ÒÔÔËÐС£´Ëʱ»á³öÏÖÒ»¸ö¶Ô»°¿ò¡£ÓйظöԻ°¿ò£¬Çë×¢ÒâÒÔÏÂ4¸öÊÂÏ

  1. ĬÈϰ²×°Â·¾¶Î»ÓÚµ±Ç°WindowsÓû§µÄAppData/Ŀ¼ÖС£
  2. ¡°The Customize installation£¨×Ô¶¨Òå°²×°£©¡±°´Å¥¿ÉÒÔ×Ô¶¨Ò尲װλÖúÍÑ¡Ôñ°²×°µÄ¸½¼Ó¹¦ÄÜ¡£
  3. ¡°Install launcher for all users (recommended) ΪËùÓÐÓû§°²×°Æô¶¯Æ÷£¨ÍƼö£©¡±ÎªÄ¬ÈÏÑ¡Ïî¡£ÕâÒâζ׿ÆËã»úÉϵÄÿ¸öÓû§¶¼¿ÉÒÔ·ÃÎÊpy.exeÆô¶¯Æ÷¡£
  4. ¡°The Add Python to path checkbox£¨½«PythonÌí¼Óµ½Â·¾¶£©¡±¸´Ñ¡¿òĬÈÏδѡÖС£Õâ²»ÊDZØÐèµÄ£¬ÒòΪ°²×°ºópy»á×Ô¶¯»ñµÃ·¾¶¡£
    ÏÖÔÚ£¬ÄúÒѾ­°²×°ÁËPython¡£

ÏÖÔÚ£¬ÄúÒѾ­°²×°ÁËPython¡£

Ϊȷ±£°²×°³É¹¦£¬ÇëÔÚPowerShellÖÐÔËÐÐÒÔÏÂÃüÁ

> py ¨Cversion

½á¹ûÓ¦¸ÃÀàËÆÓÚ£º

Python 3.9.5

1.3.2 ʹÓÃÐéÄâ»·¾³£¨Windows£©

ΪÁË·½±ãµØÔËÐÐPython£¬½¨ÒéʹÓÃÐéÄâ»·¾³¡£ÓйØÐéÄâ»·¾³µÄ¶¨Ò壬Æä±ØÒªÐÔÒÔ¼°°²×°·½Ê½µÄ¸üÏêϸÃèÊö£¬Çë·ÃÎÊRealPython.comµÄpythonÐéÄâ»·¾³Ò³ÃæÁ˽⡣ʹÓÃÐéÄâ»·¾³µÄÄ¿µÄÊǰïÖú´æ´¢Ä¿Â¼ºÍ½ÓÊÕÖîÈçcanlibÖ®ÀàµÄÕ¾µã°ü¡£

ÒªÔÚwindowsÖд´½¨ÐéÄâ»·¾³£¬ÇëÔÚpowershellÖÐÔËÐÐÒÔÏÂÃüÁ

> py -3 -m venv .venv ¨Cprompt .

¡°py -3¡± ¹æ¶¨WindowsÆô¶¯Python 3µÄ×îа汾£¬ÓÐ¹ØÆô¶¯Æ÷µÄ¸ü¶àÐÅÏ¢£¬Çë²é¿´Îĵµ¡£ ¡°-m¡± ±íʾÄúÒªÔËÐÐÒ»¸öÄ£¿é£¬¡°venv¡± ÊÇÄ£¿éµÄÃû³Æ¡£¡°.venv¡± ¾ö¶¨ÁËÐéÄâ»·¾³Öд´½¨µÄĿ¼µÄÃû³Æ¡£¡°¨Cprompt¡± ±»¼¤»îʱ£¬½«¸ü¸ÄÐéÄâ»·¾³µÄÃû³Æ£¬¡°.¡± Ö¸¶¨Ãû³ÆÓ¦Ó뵱ǰĿ¼Ïàͬ¡£

Òª¼¤»îÐéÄâ»·¾³£¬ÇëÔÚpowershellÖÐÔËÐÐÒÔÏÂÃüÁ½á¹ûÓ¦¸ÃÀàËÆÓÚ£º

> .\.venv\Scripts\activate

(pyproj)>

´Ë´úÂëÔËÐÐactivate½Å±¾£¨½Å±¾ÊÇ´øÓÐPython´úÂëµÄÎļþ£©¡£¸Ã½Å±¾Î»ÓÚ.venvĿ¼ÖеÄScriptsĿ¼ÖС£Èç¹ûÎÒÃÇÔÚPowerShellÖÐÔËÐв¢µÃµ½´íÎóÏûÏ¢£º

cannot be loaded because running scripts is disabled on this system.£¨ÎÞ·¨¼ÓÔØ£¬ÒòΪÔÚ´ËϵͳÉϽûÓÃÁËÔËÐнű¾¡££©Óйظü¶àÐÅÏ¢£¬Çë²Î¼ûhttps:/go.microsoft.com/fwlink/?LinkID=135170 ÖеÄabout_Execution_Policies¡£

È»ºó£¬ÎÒÃÇÐèÒª»ñµÃÔËÐнű¾µÄȨÏÞ¡£ÎÒÃÇ¿ÉÒÔÔËÐУº

> Set-ExecutionPolicy Unrestricted -Scope Process

ÔÚpowershellÖлñÈ¡´Ë»á»°µÄȨÏÞ£¬»òÕßÎÒÃÇ¿ÉÒÔÔËÐУº

> Set-ExecutionPolicy Unrestricted -Scope CurrentUser

ÔÚpowershellÖÐΪµ±Ç°Óû§»ñÈ¡ËùÓкóÐø»á»°µÄȨÏÞ¡£

ÏÖÔÚ£¬ÎÒÃÇ¿ÉÒÔµ¥¶ÀʹÓû·¾³¡¢°üºÍ×ÊÔ´¡£ÒªÍ£ÓÃÐéÄâ»·¾³£¬ÇëÔÚpowershellÖмüÈëÒÔÏÂÃüÁ

> deactivate

1.3.3 ÏÂÔØ²¢°²×°CANlibÇý¶¯³ÌÐòºÍSDK£¨Windows£©

ÔÚWindowsÉÏ£¬Ê×ÏÈÎÒÃÇÐèÒª°²×°CANlibÇý¶¯³ÌÐò£¬Äú¿ÉÒÔ´ÓÔÆº£ÓÎÏ·ÏÂÔØÒ³Ãæ»òÖ±½Ó´Ókvaser_drivers_setp.exeÏÂÔØ²¢ÔËÐС°Ôƺ£ÓÎÏ· Drivers for Windows¡±¡£

Èç¹ûÐèҪʹÓõIJ»½ö½öÊÇ»ù±¾µÄcanlib¿â£¬ÄÇô»¹ÐèÒªÏÂÔØÔÆº£ÓÎÏ· CANlib SDK£¬·½·¨ÊÇ´ÓÍ¬Ò»ÔÆº£ÓÎÏ·Ò³Ãæ»òÖ±½Ó´Ócanlib.exeÏÂÔØ²¢°²×°¡£Õ⽫°²×°ÆäËûÖ§³Ö¿âµÄdllÎļþ¡£

ÕâÁ½¸ö°ü£¬¡°Ôƺ£ÓÎÏ· Drivers for Windows¡±ºÍ¡°Ôƺ£ÓÎÏ· CANlib SDK¡±£¬°üº¬Ëù°üº¬dllÎļþµÄ32λºÍ64λ°æ±¾¡£

Ϊȷ±£Çý¶¯³ÌÐòÒÑÕýÈ·°²×°£¬Çë°´windows°´Å¥£¬È»ºóËÑË÷¡°Ôƺ£ÓÎÏ· Device Guide£¨Ôƺ£ÓÎÏ·É豸ָÄÏ£©¡±¡£Èç¹û³öÏÖ¡°Ôƺ£ÓÎÏ· Device Guide£¨Ôƺ£ÓÎÏ·É豸ָÄÏ£©¡±£¬Ôò´ú±í°²×°³É¹¦¡£

1.4 Linux

Èç¹ûÄúʹÓõÄÊÇLinux²Ù×÷ϵͳ£¬ÒÔϲ¿·Ö½«½âÊÍÈçºÎÏÂÔØLinuxרÃÅÐèÒªµÄÈí¼þ¡£Èç¹ûÄúÓÐWindows²Ù×÷ϵͳ£¬Çë²é¿´ÉÏÒ»²¿·ÖÄÚÈÝ¡£

1.4.1 ÏÂÔØ²¢°²×°Python£¨Linux£©

µÚÒ»²½Êǰ²×°Python¡£Óйذ²×°PythonµÄ²»Í¬·½·¨µÄÏêϸָÄÏ£¬Çë·ÃÎÊRealPython.com°²×° Python¡£ÒÔÏÂÊÇÔÚLinuxϰ²×°PythonµÄ¼òÒª¸ÅÊö£º

1.4.1.1 ¼ì²éPython°æ±¾£¨Linux£©

ÔÚLinuxϰ²×°Python֮ǰ£¬Çë¼ì²éÊÇ·ñÒѰ²×°»òÕß°²×°ÁËÄĸö°æ±¾¡£´ò¿ªÖն˲¢³¢ÊÔÒÔÏÂÃüÁ

$ python ¨Cversion
$ python3 ¨Cversion # Used by most Linux system to invoke python v3+

Èç¹û°²×°ÁËPython£¬ÔòÆäÖÐÒ»¸ö»òÁ½¸öÃüÁ·µ»ØÒÔÏÂÐÅÏ¢£¨½ØÖÁ2021Äê6ÔÂ15ÈÕ£¬Python 3.9.5ÊÇ×îа汾£©£º

Python 3.9.5

Èç¹ûδ°²×°Python»ò°²×°µÄ°æ±¾Ì«¾É£¬Çë²é¿´ÏÂÒ»²¿·ÖÄÚÈÝÒÔ°²×°¸üа汾µÄPython¡£

1.4.1.2 °²×°Python£¨Linux£©

Èç¹ûÒѾ­°²×°ÁË¿ÉʹÓõÄPython°æ±¾£¨3.7+£©£¬ÇëÌø¹ýÕâÒ»²¿·Ö£¬·ñÔòÇë°²×°Python¡£ÔÚ±¾Ö¸ÄÏÖУ¬ÎÒÃǽ«Ê¹ÓòÙ×÷ϵͳµÄÈí¼þ°ü¹ÜÀíÆ÷¡£Çë×¢Ò⣬ÓÐЩ²Ù×÷ϵͳûÓÐÈí¼þ°ü¹ÜÀíÆ÷¡£Çë·ÃÎÊrealpython.comÁ˽â¸ü¶àÐÅÏ¢¡£ÎÒÃÇÖ»»á½éÉÜÈçºÎÔÚUbuntu 18.04¡¢Ubuntu 20.04ÒÔ¼°¸ü¸ß°æ±¾Éϰ²×°¡£Óйز»Í¬²Ù×÷ϵͳµÄ½øÒ»²½ËµÃ÷£¬Çë·ÃÎÊRealPythonÔÚLinuxÉϰ²×°Python¡£

¶ÔÓÚUbuntu£¬Ê×ÏÈÔËÐÐÒÔÏÂÃüÁîÒÔÈ·¶¨±¾µØUbuntu°æ±¾£º

$ lsb_release -a

È»ºó£¬Èç¹û°æ±¾ºÅΪ18.04»ò20.04¼°¸ü¸ß£¬ÇëÖ´ÐÐÒÔϲÙ×÷£º

$ sudo apt-get update
$ sudo apt-get install python3 python3-pip

°²×°Íê³Éºó£¬Ê¹ÓÃpython3ÃüÁîÔËÐÐPython£¬Ê¹ÓÃpip3ÃüÁîÔËÐÐpip¡£ÔÙ´ÎÔËÐÐPython3 –versionÒÔÈ·±£°²×°³É¹¦¡£

1.4.2 ʹÓÃÐéÄâ»·¾³£¨Linux£©

ΪÁË·½±ãµØÔËÐÐPython£¬½¨ÒéʹÓÃÐéÄâ»·¾³¡£ÓйØÐéÄâ»·¾³µÄ¶¨Ò壬Æä±ØÒªÐÔÒÔ¼°°²×°·½Ê½µÄ¸üÏêϸÃèÊö£¬Çë·ÃÎÊRealPython.comµÄpythonÐéÄâ»·¾³Ò³Ã档ʹÓÃÐéÄâ»·¾³µÄÄ¿µÄÊǰïÖú´æ´¢Ä¿Â¼ºÍ½ÓÊÕÖîÈçcanlibÖ®ÀàµÄÕ¾µãÈí¼þ°ü¡£

ÔÚ´´½¨ÐéÄâ»·¾³Ö®Ç°£¬ÎÒÃÇÐèÒª´´½¨Ò»¸öÎļþ/Ŀ¼£¬ÓÃÓÚ·ÅÖÃÎÒÃÇËùÐèµÄÐéÄâ»·¾³ºÍ½«Ê¹Óøû·¾³µÄÏîÄ¿¡£ÔÚ´ËʾÀýÖУ¬´´½¨µÄÎļþÃûΪenv¡£

Ê×ÏÈ£¬Ê¹ÓÃÒÔÏÂÃüÁî´´½¨Ò»¸öÐÂĿ¼²¢½øÈëÆäÖУº

$ mkdir python-virtual-environments && cd python-virtual-environments

È»ºó£¬Ê¹ÓÃÒÔÏÂÃüÁî°²×°PythonÐéÄâ»·¾³£º

$ sudo apt-get install python3-venv

ÒªÔÚLinuxÖд´½¨ÐéÄâ»·¾³£¬ÇëÔËÐÐÒÔÏÂÃüÁ

$ python3 -m venv .venv ¨Cprompt pyproj

¡°python3¡±Ö¸Ê¾Linux½«Æô¶¯Python 3µÄ×îа汾£¬¡°-m¡±Ö¸Ê¾ÎÒÃÇÒªÔËÐÐÒ»¸öÄ£¿é£¬¡°venv¡±ÊÇÄ£¿éµÄÃû³Æ¡£¡°.venv¡±¾ö¶¨½«ÔÚÆäÖд´½¨ÐéÄâ»·¾³µÄĿ¼µÄÃû³Æ¡£¡°¨Cprompt¡±ÔÚÐéÄâ»·¾³±»¼¤»îʱ¸ü¸ÄÆäÃû³Æ£¬¡°pyproj¡±Ö¸¶¨Ãû³ÆÓ¦Îª¡°pyproj¡±¡£

Òª¼¤»îÐéÄâ»·¾³£¬ÎÒÃÇÐèÒªÔËÐÐÒÔÏÂÃüÁ

$ source .venv/bin/activate
(pyproj) $

ÕâÊÇÒ»Ìõͨ¹ývenvµ½bin×îºó¼¤»îµÄÔ´´úÂë·¾¶¡£ÏÖÔÚ£¬ÎÒÃÇ¿ÉÒÔµ¥¶ÀʹÓû·¾³¡¢°üºÍ×ÊÔ´¡£ÒªÍ£ÓÃÐéÄâ»·¾³£¬Çë¼üÈ룺

(pyproj) $ deactivate

1.4.3 ÏÂÔØ²¢°²×°CANlibÇý¶¯³ÌÐòºÍSDK£¨Linux£©

ÔÚLinuxÖУ¬Ê×ÏÈͨ¹ýÏÂÔØºÍ°²×°”ÔÆº£ÓÎÏ· LINUX Driver and SDK”À´°²×°CANlib£¬¸ÃÈí¼þ¿ÉÒÔÔÚÔÆº£ÓÎÏ·ÏÂÔØÒ³ÃæÖлòÖ±½Ó´Ólinuxcan.tar.gzÖÐÕÒµ½¡£

Èç¹ûҪʹÓõIJ»½ö½öÊÇ»ù±¾µÄcanlib¿â£¬Ôòͨ¹ýÏÂÔØºÍ°²×°”Linux SDK¿â” kvlibsdk.tar.gzÀ´»ñµÃÆäËûÖ§³ÖµÄ¿â¡£Òª¼ì²éÊÇ·ñÕýÈ·°²×°£¬ÇëÔËÐÐlistChannels£¬½á¹ûÓ¦¸ÃÀàËÆÓÚ£º

(pyproj)$ /usr/doc/canlib/examples/listChannels
CANlib version 5.36
Found 4 channel(s).
ch 0: ÔÆº£ÓÎÏ· USBcan Pro 2xHS v2 73-30130-00752-9, s/n 13406, v3.25.753 (mhydra v8.36.575)
ch 1: ÔÆº£ÓÎÏ· USBcan Pro 2xHS v2 73-30130-00752-9, s/n 13406, v3.25.753 (mhydra v8.36.575)
ch 2: ÔÆº£ÓÎÏ· Virtual CAN 0-00000-00000-0, s/n 1, v0.0.0 (kvvirtualcan v8.36.575)
ch 3: ÔÆº£ÓÎÏ· Virtual CAN 0-00000-00000-0, s/n 1, v0.0.0 (kvvirtualcan v8.36.575)

2 °²×°Python canlib°ü

ҪʹÓÃpip°²×°Python°ücanlib£¬Çëͨ¹ýPowerShell¼¤»îÐéÄâ»·¾³£¬È»ºóÔËÐÐÒÔÏÂÃüÁ

.\.venv\Scripts\activate
(pyproj)> pip install canlib

Ϊȷ±£canlibÒÑÕýÈ·°²×°£¬ÇëÔÚPython½âÊÍÆ÷ÖÐÔËÐÐÒÔÏ´úÂë¡£Òª´ò¿ªPython½âÊÍÆ÷£¬Ö»ÐèÔÚPowerShellÖмüÈëpython»òpy¡£ÒªÁ˽âÓйØPython½âÊÍÆ÷µÄ¸ü¶àÐÅÏ¢£¬Çë·ÃÎÊPythonÎĵµ£º

(pyproj)> python
Python 3.9.5 (tags/v3.9.5:0a7dcbd, May 3 2021, 17:27:52) [MSC v.1928 64 bit (AMD64)] on win32
¼üÈë¡°°ïÖú¡±¡¢¡°°æÈ¨¡±¡¢¡°ÐÅÓá±»ò¡°Ðí¿ÉÖ¤¡±ÒÔ»ñÈ¡¸ü¶àÐÅÏ¢¡£
>>> from canlib import canlib
>>> canlib.prodversion()

½á¹ûÓ¦¸ÃÀàËÆÓÚ£º

VersionNumber(major=5, minor=36, release=None, build=None)

ÏÂÔØcanlibºó£¬Èç¹ûÏÔʾÒÔϱ¨ÎÄ£º

WARNING: You are using pip version 21.1.1; however, version 21.1.2 is available.£¨¾¯¸æ£ºÄúʹÓõÄÊǰ汾21.1.1µÄpip£»µ«ÊÇ£¬21.1.2°æ±¾ÊÇ¿ÉÓõÄ¡££©
ÄúÓ¦¸Ã¿¼ÂÇͨ¹ý¡°C:\Users\extac\Pyproj\.venv\scripts\python.exe -m pip install ¨Cupgrade pip¡±ÃüÁî½øÐÐÉý¼¶¡£

Ö»Ðè°´ÕÕ½¨ÒéÔÚPowerShellÖÐÔËÐÐÒÔÏÂÃüÁ

C:\Users\extac\Pyproj\.venv\scripts\python.exe -m pip install ¨Cupgrade pip

ÒԱ㽫pipÉý¼¶µ½×îа汾¡£

3 °²×°Ó²¼þ

3.1 °²×°Ôƺ£ÓÎÏ· CANͨѶÒÇ

£¨¿ÉÒÔʹÓÃÈκε¥Â·¡¢Ë«Â·»òËÄÂ·ÔÆº£ÓÎÏ· CANͨѶÒÇ¡£Ò²¿ÉÒÔÔÚͨѶÒÇģʽÏÂʹÓÃÔÆº£ÓÎÏ· Memorator¡££©

±¾Ö¸ÄÏÖÐʹÓõÄÓ²¼þ°üÀ¨Ôƺ£ÓÎÏ· USBcan Pro 2xHS v2ºÍÔÆº£ÓÎÏ· T-cannector v2¡£ÔÚ½«Ó²¼þÁ¬½ÓÔÚÒ»Æð֮ǰ£¬ÇëÈ·±£T-cannectorÉèÖÃΪ60Å·Ä·£¨Ê¹ÓúÐ×ÓÉϵĿª¹Ø£©¡£ËùÐèµÄÄÚ²¿ÖÕ¶ËÈ¡¾öÓÚ½ÚµãµÄÊýÁ¿¡£60Å·Ä·µÄ¸ºÔؽ«ÎªÁ¬½Óµ½×ÜÏßµÄÈκÎÊýÁ¿µÄ½ÚµãÌṩÊʵ±µÄÒþÐÔµçÆ½¡£ÓйØÖն˵ĸü¶àÐÅÏ¢£¬Çë·ÃÎÊÔÆº£ÓÎÏ·.comÖÕ¶Ë¡£

Òª°²×°USBcan£¬Ö»Ð轫Æä²åÈë¼ÆËã»ú£¬ÆäÓàµÄ¹¤×÷½«ÓÉÓ²¼þÍê³É¡£Á½¸öCAN´¥µã¶¼ÐèÒª²åÈëT-cannector£¬·ñÔòͨµÀÖ®¼ä½«ÎÞ·¨·¢Ëͱ¨ÎÄ¡£±¨ÎÄ·¢Ëͺó£¬ÈκÎÕýÈ·½ÓÊÕ±¨ÎĵÄCAN¿ØÖÆÆ÷¶¼»áÔÚ±¨ÎÄĩβÌí¼ÓÈ·ÈÏλ¡£Èç¹û±¨ÎÄδ±»È·ÈÏ£¬·¢ËÍ·½½«ÖØ·¢±¨ÎÄ£¬Ö±µ½±¨Îı»È·ÈÏΪֹ¡£Òò´Ë£¬ÒªÄܹ»ÕýÈ··¢Ëͱ¨ÎÄ£¬ËüÐèÒª±»½ÓÊÕ¡£ÓйØÈ·ÈϺÍCAN±¨Îĵĸü¶àÐÅÏ¢£¬Çë·ÃÎÊÔÆº£ÓÎÏ·.com CAN±¨ÎÄ¡£

3.2 °²×°ÐéÄâͨѶÒÇ

Èç¹ûûÓпÉÓõÄÓ²¼þ£¬ÄÇô¿ÉÒÔÔÚ±¾Ö¸ÄϵĵÚÒ»²¿·ÖʹÓÃÐéÄâͨѶÒÇ¡£ÔÚ°²×°Ôƺ£ÓÎÏ·Çý¶¯³ÌÐòʱ£¬Windows»á×Ô¶¯°²×°Á½¸öÐéÄâͨµÀ¡£Èç¹ûÄúÏëÁ˽â¸ü¶à¹ØÓÚÈçºÎ°²×°ÆäËûÐéÄâͨµÀµÄÐÅÏ¢£¬Çë·ÃÎÊÔÆº£ÓÎÏ·.com canlib°ïÖú¡£ÔÚLinuxÖУ¬ÈçÐèÏÂÔØÐéÄâÉ豸£¬Çëתµ½linuxcan\virtualcan\virtualcan.h²¢±à¼­ÒÔ϶¨ÒåÓï¾ä£º

#define NR_CHANNELS 2

#define NR_VIRTUAL_DEV 1

Äú¿ÉÒÔÔÚÔÆº£ÓÎÏ·.com°²×°LinuxÖÐÁ˽âÓйذ²×°ÐéÄâͨѶÒǵĸü¶àÐÅÏ¢£¬Èç¹ûÒªÁ˽â¸ü¶àÓйØÐéÄâ×ÜÏßµÄÒ»°ãÐÅÏ¢£¬Çë·ÃÎÊÔÆº£ÓÎÏ·.comÐéÄâÉ豸ͨµÀ¡£ÈçºÎʹÓÃÐéÄâͨѶÒǽ«ÔÚ±¾Ö¸ÄϵĺóÐø²¿·ÖÖнéÉÜ¡£

4 ÑéÖ¤°²×°

Òª²âÊÔËùÓÐÈí¼þºÍÓ²¼þÊÇ·ñÒÑÕýÈ·°²×°£¬ÇëÔÚÄúʹÓõĴúÂë±à¼­Æ÷ÖбàдÒÔÏ´úÂ룬ȷ±£¸ÃÎļþÓëÐéÄâ»·¾³Î»ÓÚͬһĿ¼ÖС£

Èç¹ûÄúûÓдúÂë±à¼­Æ÷£¬idle½«ÓëPythonÒ»Æð°²×°ÔÚWindowsÉÏ¡£ÈôÒªÔÚÐéÄâ»·¾³ÏÂʹÓÃidle£¬ÇëÔÚPowerShellÖÐÔËÐÐÒÔÏÂÃüÁ

(pyproj)> python -m idlelib

Õ⽫´ò¿ªÒ»¸öidle´°¿Ú£¬Äú¿ÉÒÔÔÚÆäÖдò¿ª´úÂëÎļþ²¢Ê¹ÓÃf5»òͨ¹ýÔËÐÐÑ¡ÏÔËÐдúÂë¡£Èç¹ûÎÒÃÇͨ¹ýÓÒ¼üµ¥»÷.pyÎļþ²¢Ñ¡Ôñ” edit with idle£¨Ê¹ÓÃidle±à¼­£©”À´´ò¿ªidle£¬ÄÇô½«ÎÞ·¨Ö±½ÓʹÓÃf5»òͨ¹ýÔËÐÐÑ¡ÏÔËÐдúÂë¡£

ÎÒÃÇÐèÒªÔÚÐéÄâ»·¾³ÄÚÔËÐеĽű¾ÊÇcheck_ch£¬ÆäÖаüÀ¨ÒÔÏ´úÂ룺

# check_ch
# Firstly import canlib so that it can be used in the script.
from canlib import canlib

# .getNumberOfChannels() is used to detect the number of channels and
# the number is saved in the variable num_channels.
num_channels = canlib.getNumberOfChannels()

# num_channels is printed out as text so that the user can see how many
# channels were found.
print(f"Found {num_channels} channels")

# Next a for loop is created. This loop will repeat the code within for each
# channel that was detected. 
for ch in range(num_channels):
# The data of each specific channel is saved in chd.
    chd = canlib.ChannelData(ch)
# Lastly the channel, channel name, product number, serial number, and local 
# channel number on the device are printed.
    print(f"{ch}. {chd.channel_name} ({chd.card_upc_no.product()}:{chd.card_serial_no}/{chd.chan_no_on_card})")

Òª´ÓPowerShellÖÐÔËÐдúÂ룬Çëתµ½ÎļþºÍÐéÄâ»·¾³ËùÔÚµÄĿ¼¡£Æô¶¯ÐéÄâ»·¾³²¢Ê¹ÓÃÒÔÏÂÃüÁîÆô¶¯ÃûΪcheck_ch.pyµÄ½Å±¾£º

.\.venv\Scripts\activate
(pyproj)> py check_ch.py

½á¹ûÓ¦µ±ÏÔʾΪ

Found 4 channels
0. ÔÆº£ÓÎÏ· USBcan Pro 2xHS v2 (channel 0) (00752-9:13406/0)
1. ÔÆº£ÓÎÏ· USBcan Pro 2xHS v2 (channel 1) (00752-9:13406/1)
2. ÔÆº£ÓÎÏ· Virtual CAN Driver (channel 0) (00000-0:0/0)
3. ÔÆº£ÓÎÏ· Virtual CAN Driver (channel 1) (00000-0:0/1)

¼ÙÉèËùÓÐÈí¼þºÍÓ²¼þ¶¼ÕýÈ·°²×°£¬0-3ÊÇCANusbÉÏ¿ÉÓõÄͨµÀ¡£ÔÚ´ËʾÀýÖУ¬ÎÒÃǽ«½öʹÓÃͨµÀ0ºÍ1¡£ÔÚLinuxÉÏ£¬Ä¬ÈÏÇé¿öϲ»»áÓÐÐéÄâͨµÀ¡£

Ò²¿ÉÒÔʹÓÃÔÆº£ÓÎÏ·É豸ָÄÏ¡£Ö»Ðè´ò¿ª¸ÃÓ¦ÓóÌÐò£¬ÎÒÃÇÓ¦¸Ã»á¿´µ½ÀàËÆÒÔϵÄÄÚÈÝ£º

ÔÚÕâ¸ö´°¿ÚÖУ¬ÎÒÃÇ¿ÉÒÔ¿´µ½ÎÒÃDzåÈëµÄÔÆº£ÓÎÏ· USBcan Pro 2xHS v2³öÏÖÔÚÁбíµÄ¶¥²¿¡£

5 ·¢ËÍCAN±¨ÎÄ

5.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_a.setBusParams(canlib.canBITRATE_250K)
ch_b.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], flags=canlib.MessageFlag.STD )
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)

5.1.1 ´ò¿ªÐéÄâͨѶÒÇ

Èç¹ûÎÒÃÇÏëҪʹÓÃÐéÄâͨѶÒǺÍÐéÄâͨµÀ£¬ÎÒÃÇÐèÒª¸ü¸Ä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£©£©¡±µÄ´íÎó¡£ÁíÍ⻹Ðè×¢Ò⣬ÐéÄâͨµÀÖ»ÄÜÓëÁíÒ»¸öÐéÄâͨµÀͨѶ¡£

5.2 ¸ü¾ß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.

5.3 ʹÓÃWriteWait

ÔÚ±àд¶àÌõ±¨ÎÄʱ£¬ÎÒÃÇÓÐʱºòÏëҪȷÈÏËüÃÇÊÇ·ñÒÑÕýÈ··¢ËÍ¡£Îª´Ë£¬ÎÒÃǽ«Ê¹ÓÃ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)

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

ÔÚʹÓÃ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¸öʼþ·¢ÉúµÄ³¬Ê±ÏÞÖÆÊ±Òý·¢µÄ´íÎó¡£Èç¹ûµÈ´ýʱ¼äÌ«³¤£¬½«Òý·¢´íÎó£¬ÎÒÃǾͻáÖªµÀ³öÁËÎÊÌâ¡£Òª½â¾öÕâ¸öÎÊÌ⣬ÎÒÃÇÐèÒª×Ðϸ¼ì²é´úÂëÒÔÕÒµ½ÎÊÌâ¡£ÎÊÌâ¿ÉÄÜÊÇдÈëͨµÀ²»ÔÚ×ÜÏßÉÏ»ò´¦ÓÚ¾²Ä¬Ä£Ê½¡£

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

ÓжàÖÖ·½Ê½¿ÉÒÔ»ñÈ¡ÓйØ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ºÁÃë¡£

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

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

  • Æô¶¯Windows Powershell£º
    powershell.exe
  • Çл»µ½Äú´æ·ÅPython½Å±¾µÄĿ¼£ºcd£¨Èç¹ûÄúÒѾ­ÓÐÒ»¸öÐéÄâ»·¾³²¢ÇÒ¾ßÓÐÔËÐÐȨÏÞ£¬ÔòÌø¹ý½ÓÏÂÀ´µÄÁ½¸ö²½Ö裩
  • ´´½¨Ò»¸öÐéÄâ»·¾³£º
    py -3 -m venv .venv ¨Cprompt .
  • Èç¹ûÄúÊÇʹÓÃмÆËã»ú»òûÓÐȨÏÞµÄÐÂÓû§£º
    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
Author Image

Anton Carlsson

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

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