激情综合丁香-激情综合六月-激情综合婷婷亚洲图片-激情综合图区-激情综合网五月

libsocketcan — 通過應(yīng)用程序配置CAN接口

 2020-3-23     作者:黃志超         
文章標(biāo)簽:C/C++CAN

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


  Linux系統(tǒng)對于CAN總線的支持是采用的Socket CAN方式,Scoket CAN使用了socket接口和Linux網(wǎng)絡(luò)協(xié)議棧,這種方法使得CAN設(shè)備驅(qū)動可以通過網(wǎng)絡(luò)接口函數(shù)來調(diào)用,這樣大大地方便了熟悉Linux網(wǎng)絡(luò)編程的程序員,由于調(diào)用的都是標(biāo)準(zhǔn)的socket 函數(shù),也使得應(yīng)用程序便于移植,而不會因?yàn)橛布恼{(diào)整而修改應(yīng)用程序,這樣加強(qiáng)了應(yīng)用程序的可維護(hù)性。關(guān)于Socket CAN的資料在Linux內(nèi)核文檔中有更為詳細(xì)的介紹https://www.kernel.org/doc/Documentation/networking/can.txt。在英創(chuàng)公司提供的資料中,也包含了使用Scoket CAN的例程。


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


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


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



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


#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總線的初始化設(shè)置,如果客戶還有一些比較特殊的需求,比如設(shè)置特定的采樣和工作模式等,可以在libsocketcan的官方網(wǎng)站:https://lalten.github.io/libsocketcan/Documentation/html/group__extern.html上查看其它更多的函數(shù)及其功能介紹。


  如果有感興趣的客戶,可以和英創(chuàng)工程師聯(lián)系,索取完整工程文件。

文章標(biāo)簽:C/C++CAN
主站蜘蛛池模板: 国产一级爱c片免费观看| 国产精品vv在线| 国产精品不卡在线| 中文字幕色婷婷在线精品中| 日本特级黄色录像| 亚洲综合久久1区2区3区| 免费看黄色毛片| 南京巨根无套操到你窒息| 91蝌蚪在线视频| 美女啪啪国产| 日日噜噜噜夜夜爽爽狠狠| 一区二区高清视频在线观看| 亚洲成a人片在线观看播放| 国产人成免费视频| 国产精品久久久久久久y| 黄网站在线免费| 激情五月综合婷婷| 嫩草视频在线观看视频播放| 泰国一级淫片免费看| 亚洲精品一区二区久久这里| 18年大片免费在线观看| www.av片| 一级毛片直接看| 久久aaa| 亚州毛色毛片免费观看| 欧美成人性生活视频| 国产专区91| 美女免费视频一区二区| 国产成人久久综合热| 国产一区二区精品人妖系列| 香蕉视频久久| 亚洲国产色图| 亚洲精品久久久久综合网| 一级二级三级黄色片| 三级理论中文字幕在线播放| 亚州一级毛片| 丝袜国产| 中文字幕在线一区二区三区| 成人在线短视频| 欧美中文字幕在线视频| 国产这里只有精品|