<strike id="kiyse"></strike>
  • <tr id="kiyse"></tr>
  • <strike id="kiyse"></strike><samp id="kiyse"><tbody id="kiyse"></tbody></samp>
    <strike id="kiyse"><s id="kiyse"></s></strike>
    <tr id="kiyse"></tr>
    <noframes id="kiyse"><code id="kiyse"></code></noframes>
    <th id="kiyse"></th>
    <samp id="kiyse"></samp>
  • <th id="kiyse"><s id="kiyse"></s></th>
  • libsocketcan — 通過應用程序配置CAN接口

     2020-3-23     作者:黃志超         
    文章標簽:C/C++CAN

      CAN總線作為工業現場最常用的總線協議之一,應用十分廣泛。英創公司推出的ESMARC系列工控主板中的ESM3352、ESM3354、ESM6800、ESM680、ESM7000等都板載了兩路CAN總線供客戶使用,同時也推出了擴展方案來應對各種需求(擴展方案只能支持帶有ISA總線的主板型號),客戶可以通過英創工控主板上的ISA總線擴展出4路CAN總線,具體的方案可以參考文章:《6路獨立CAN總線的實現方案》,所以在英創提供的方案中CAN總線資源是十分豐富的。


      Linux系統對于CAN總線的支持是采用的Socket CAN方式,Scoket CAN使用了socket接口和Linux網絡協議棧,這種方法使得CAN設備驅動可以通過網絡接口函數來調用,這樣大大地方便了熟悉Linux網絡編程的程序員,由于調用的都是標準的socket 函數,也使得應用程序便于移植,而不會因為硬件的調整而修改應用程序,這樣加強了應用程序的可維護性。關于Socket CAN的資料在Linux內核文檔中有更為詳細的介紹https://www.kernel.org/doc/Documentation/networking/can.txt。在英創公司提供的資料中,也包含了使用Scoket CAN的例程。


      Socket CAN提供的接口沒有包含對CAN總線設置的功能,所以在程序中使用CAN總線通訊之前,需要先使用英創公司移植的iproute2中的ip命令來設置CAN總線,比如波特率、采樣點的設置等,關于使用ip命令來設置CAN總線的詳細方法可以參考文章:《EM9287 Linux Socket CAN驅動簡介》,目前我們的例程也是使用的這種方法設置CAN總線,客戶還可以參考我們提供的例程。


      為了簡化客戶的操作,讓程序更加簡單易讀,英創公司特地移植了libsocketcan庫,這個庫提供了接口函數來設置CAN總線,彌補了Socket CAN中缺少的部分。下面我們就來介紹如何利用libsocketcan提供的函數設置CAN總線,首先介紹常用的函數有四個:


    /**
     *    關閉CAN總線
    *
    *    函數會關閉指定的CAN總線,將狀態置為down,最好在設置之前調用一次
    *
    *    參數說明:
    *    name:代入CAN總線的名稱(即使用ifconfig –a命令查看到的名稱),例如can0或者
    *    can1等
    *
     *    返回值說明:
    *    0 成功
    *    -1 失敗
    *
     */
     int can_do_stop(const char *name)
    /**
     *    設置CAN總線波特率
    *
    *    函數設置CAN總線的波特率
    *
    *    參數說明:
    *    name:代入CAN總線的名稱(即使用ifconfig –a命令查看到的名稱),例如can0或者
    *    can1等
    *    bitrate:需要設置的波特率。
    *
     *    返回值說明:
    *    0 成功
    *    -1 失敗
    *
     */
     int can_set_bitrate(const char * __u32)
    /**
     *    設置CAN總線復位時間
    *
    *    函數設置CAN總線的復位時間(單位毫秒),一旦CAN總線出現bus_off,經過設置時長會自動復位
    *
    *    參數說明:
    *    name:代入CAN總線的名稱(即使用ifconfig –a命令查看到的名稱),例如can0或者can1等
    *    restart_ms:需要設置的復位時間
    *
     *    返回值說明:
    *    0 成功
    *    -1 失敗
    *
     */
     int can_set_restart_ms( const char *name, __u32 restart_ms)
    /**
     *    啟動CAN總線
    *
    *    函數會啟動指定的CAN總線,將狀態置為up
    *
    *    參數說明:
    *    name:代入CAN總線的名稱(即使用ifconfig –a命令查看到的名稱),例如can0或者
    *    can1等
    *
     *    返回值說明:
    *    0 成功
    *    -1 失敗
    *
     */
     int can_do_start( const char *name )



      利用這四個函數就能夠完成對CAN總線的設置,如果在代碼中需要使用libsocketcan提供的函數,需要包含頭文件libsocketcan.h,并且在鏈接庫中增加libsocketcan的選項,增加庫的方法和使用必讀手冊中介紹的增加線程庫方法是完全相同的,示例代碼如下:


    #include <libsocketcan.h>
     
    int main()
    {     
           int  i, devnum, bitrate, restime;
           char       devname[5];
     
           devnum = 0;
           sprintf(devname, "can%d", devnum);
          
           i = can_do_stop(devnum);
          
           bitrate = 500000;
           i += can_set_bitrate(devnum, bitrate);
          
           restime = 50;
           i += can_set_restart_ms(devnum, restime);
          
           i += can_do_start(devnum);
           if(i < 0)
           {
                  printf("fail to set %s!\n", devname);
                  return i;
           }
    }


      上面的代碼可以代替CAN總例程中使用ip命令對CAN總線的初始化設置,如果客戶還有一些比較特殊的需求,比如設置特定的采樣和工作模式等,可以在libsocketcan的官方網站:https://lalten.github.io/libsocketcan/Documentation/html/group__extern.html上查看其它更多的函數及其功能介紹。


      如果有感興趣的客戶,可以和英創工程師聯系,索取完整工程文件。

    文章標簽:C/C++CAN
    国产A级毛片久久久精品毛片| 国产麻豆精品入口在线观看| 国产精品三级av及在线观看| 国产精品日韩深夜福利久久| 97久久超碰国产精品2021| 国产精品99久久免费| 无码精品尤物一区二区三区| 99久久99热精品免费观看国产| 99热这里只有精品免费播放| 精品国产成人国产在线观看| 91精品免费久久久久久久久| 国产愉拍精品视频手机| 国产精品资源在线观看网站| 国产麻豆精品入口在线观看| 国产精品亚洲а∨无码播放不卡| 久久精品国产半推半就| 亚洲av纯肉无码精品动漫| 国产香蕉国产精品偷在线观看| 国产精品bbwbbwbbw| 国产在线精品国自产拍影院| 在线精品视频一区二区| 久久精品国产精品国产精品污| 精品水蜜桃久久久久久久| 青青青青久久精品国产h久久精品五福影院1421 | 日韩精品一区二区三区中文| 日韩精品福利视频一区二区三区| 久久精品国产精品亚洲精品| 色噜噜亚洲精品中文字幕| 精品无人乱码一区二区三区| 久热综合在线亚洲精品| 国产成人精品男人免费| 成人99国产精品| 青草青草久热精品观看| 56prom在线精品国产| 四虎国产精品免费永久在线| 国产精品亚洲综合一区| 亚洲精品成人网久久久久久| 久久久精品天堂无码中文字幕 | 四虎亚洲精品高清在线观看| 久久香蕉国产线看精品| 久久精品无码一区二区三区|