顯示具有 Linux 標籤的文章。 顯示所有文章
顯示具有 Linux 標籤的文章。 顯示所有文章

2015年4月20日 星期一

CANBUS 發送與接收使用Socket CAN

參考文件 https://www.kernel.org/doc/Documentation/networking/can.txt
中文參考 http://blog.csdn.net/yuanlulu/article/details/7220060

控制器區域網路 (Controller Area Network, 簡稱 CAN 或 CANbus)
一種通訊協定,主要應用在汽車、工控領域。
目前版本CAN 2.0A與CAN 2.0B ,B是A的擴充。2.0B 的ID長度占29bit, 2.0A 的ID長度占11bit

節點架構


CAN Controller 通常內建於MCU內(也有獨立的ex: SJA1000),會在外接Transceiver(ex:ISO1050)轉成類比訊號。

CAN封包格式


寫基本的CAN,只需要注意仲裁欄位、控制欄位、資料欄位

Field nameLength (bits)Purpose
Start-of-frame1Denotes the start of frame transmission
Identifier (green)11A (unique) identifier which also represents the message priority
Remote transmission request (RTR)1Must be dominant (0) for data frames and recessive (1) for remote request frames (see Remote Frame, below)
Identifier extension bit (IDE)1Must be dominant (0) for base frame format with 11-bit identifiers
Reserved bit (r0)1Reserved bit. Must be dominant (0), but accepted as either dominant or recessive.
Data length code (DLC) (yellow)4Number of bytes of data (0–8 bytes)[a]
Data field (red)0–64 (0-8 bytes)Data to be transmitted (length in bytes dictated by DLC field)
CRC15Cyclic redundancy check
CRC delimiter1Must be recessive (1)
ACK slot1Transmitter sends recessive (1) and any receiver can assert a dominant (0)
ACK delimiter1Must be recessive (1)
End-of-frame (EOF)7Must be recessive (1)
CAN BUS的操作可以如同使用SOCKET。
參考Linux下範例 candsend.c   candump.c
看完除了會can 的發送與接收,也可以學到命令列參數使用方法 (function: getopt_long)

以下簡單範例:
Setting :
    struct can_frame frame;
    struct ifreq ifr;
    struct sockaddr_can addr;
    char *interface = "can0";
    int family = PF_CAN, type = SOCK_RAW, proto = CAN_RAW;

    s = socket(family, type, proto)
    strncpy(ifr.ifr_name, interface, sizeof(ifr.ifr_name));
    if (ioctl(s, SIOCGIFINDEX, &ifr)) {
        perror("CAN ioctl");
        return 1;
    }
    addr.can_family = family;
    addr.can_ifindex = ifr.ifr_ifindex;

    if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
        perror("CAN bind");
        return 1;
    }
Send :
//sendcanbus();
            frame.can_id = 0x0321;
            frame.can_dlc = 4;
            frame.data[0] = 0;
            frame.data[1] = 1;
            frame.data[2] = 2;
            frame.data[3] = 3;

            ret = send(s,&frame,sizeof(frame),0);
Read :
            //dropt the timeout packets
            while(nbytes = recvfrom(s,&frame,sizeof(struct can_frame),0,(struct sockaddr*)&addr,&len)>=0)
            {
                printf("\r\nrecvfrom nbytes %d",nbytes);
                memcpy(b,&frame,sizeof(frame));
                for (i=0 ; i < sizeof(struct can_frame) ; i++)
                {
                    printf(" 0x%x ",b[i]);
                }
                usleep(10000);//
            }
           

2014年3月28日 星期五

IP Alias

需求:
  1. 人機有兩顆實體網路port ,而系統只有一個,切換人機按鈕決定走哪一port。
  2. UDP協定
問題:
    人機兩個實體port網域(30.x , 29.x) 不同,而系統預設網域為.30.x,若切換到port2,會發生  ENETUNREACH 101     /* Network is unreachable */

解決方法:
    系統端產生網路IP Alias,同一實體網卡包兩組IP


 人機網卡配置
eth0      Link encap:Ethernet  HWaddr 00:19:23:05:37:B1
          inet addr:192.168.30.1  Bcast:192.168.30.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:66267 errors:0 dropped:0 overruns:0 frame:0
          TX packets:50736 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:15513046 (14.7 MiB)  TX bytes:6076898 (5.7 MiB)
          Interrupt:29

eth1      Link encap:Ethernet  HWaddr 00:E0:3D:F4:61:17
          inet addr:192.168.29.1  Bcast:192.168.29.255  Mask:255.255.255.0
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
          Interrupt:79

系統終端下指令,產生網路IP Alias,且設定IP
ifconfig eth0:0 192.168.29.100
系統端網卡配置結果:
eth0      Link encap:Ethernet  HWaddr 12:34:56:78:9A:BC
          inet addr:192.168.30.2  Bcast:192.168.30.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:55863 errors:0 dropped:0 overruns:0 frame:0
          TX packets:50735 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:7074697 (6.7 MiB)  TX bytes:12358948 (11.7 MiB)
          Interrupt:67

eth0:0    Link encap:Ethernet  HWaddr 12:34:56:78:9A:BC
          inet addr:192.168.29.100  Bcast:192.168.29.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:67

2010年12月10日 星期五

安裝gcin for fedora 11

系統環境: win xp ,使用VMware 掛載Fedora11

目的是要在KDevelop下能打中文註解

gcin下載地點: http://cle.linux.org.tw/gcin/download/

選擇版本: gcin-1.5.5-liu_mdk.i586.rpm 11-Aug-2010 20:29 1.4M

GNOME桌面環境下,使用FIREFOX下載。

於終端機 CD進入 下載目錄

執行 yum install gcin

開始安裝,執行yes

安裝完成!!!!!!!!! 2010/12/7

Ref:

http://blog.xuite.net/ubuntu/linux/7668046 gcin使用說明

http://cle.linux.org.tw/gcin/download/

LINUX 學習心得

目前在學習LINUX ~
趁著這個週末~ 來紀錄一下,學到的東西,以及一些感想。

電腦環境:
  • NB: ACER ASPIRE 4741G
  • 系統: WIN XP Processional 2002 SP3
  • CPU:i5 M460@2.53GHz
  • RAM:2.98GB

小弟對這台NB評價.. 效能不錯,照我每次都開兩個瀏覽器,狂開視窗查閱資料,再加上VMware照跑.. 沒什麼大問題發生。 但是周邊裝置就有點不舒適了,USB太靠近使用者,動滑鼠就容易碰到,VGA、網路埠、電源插頭都在左手邊...非常不習慣~也不試用我的工作環境...
但整體而言..免費的就是好用 XD

LINUX環境:
  • 版本 Fedora 11 (目前到14)
  • 視窗介面: GNOME

目前使用VMware這套虛擬機器來安裝LINUX,很酷的一套軟體,早點知道這東西,以前玩遊戲就可以開分身了XD。

當初建置時沒沒Step by Step記錄下來,就照印象來說囉~
安裝好VMware,新建一個虛擬機器系給LINUX用,要設定磁碟、記憶體大小分給VMware用。
工具列 VM->Options->Guest operating system-> Linux 圈起來,Version->Red Hat Linux
我明明是要裝Fedora, 怎會選小紅帽?? ... 我真的忘了 , 好像裡面沒有Fedora選項吧 ??

開始安裝Fedora
首先,除了Next and Next,會出現的問題,是要分割硬碟(檔案系統)
boot、swap、root 等等,詳細設定 google一下就有了。
安裝設定,軟體、工具、桌面...全開!! 總比之後安裝要自行編譯容易的多XD

從VMware到LINUX裝完~ 花了2.5個小時吧~
這時候會發現即使使用全螢幕模式,我們的系統還是沒辦法真正實現全螢幕
並且鼠標陷在VMware裡頭,要跳出VMware 請按 CRTL+ ALT
先把這給改掉~ 在VMware裡的 快捷設定 設成 CRTL + SPACE
並在工具列中 選擇 Install VMware Tool , 裡面內容...我現在看不到>< ~ google是好朋友XD
安裝完後~ 就可以輕鬆移出鼠標,並且全螢幕實現~
LINUX 桌面環境其實蠻方便的~ 但是當下載軟體原始碼時 需要自己編譯、安裝~ 現在還不知道有沒有其他方式~ 至少我都是在終端機使用的~
剛開始真的不習慣啊~ 連複製檔案 都搞了一陣子 >< 所以 要碰終端機 必學指令 如下:
  • 顯示目前路徑檔案列表 : ls ` ll
  • 複製檔案至目錄XXX下 : cp
  • 移動檔案至目錄XXX下: mv
  • 移除檔案 : rm
  • 解 壓縮檔 (tar.gz): tar -xvf XXX.tar.gz
  • 安裝 : yum , rpm
  • 換目錄: cd ` cd .. (回到上一層)
  • 搜尋 : whereis `which ` find ` grep
  • 查詢指令: man ` xxx --help
  • 切換root : su
  • 目前路徑: pwd

再來~ 目錄 可分為 root 和 user
登入後 , 會在home/user/ 路徑下面 ,即 ~符號 。
root/ 是根目錄 ,即 / 符號, 也只有root 管理員 能在此目錄進行更多的動作及設定 。

環境設定,指令都熟悉差不多之後,就可以開始程式撰寫了
小弟環境是 使用 KDevelop編輯,掛QT編譯器 剛開始,也是非常不習慣啊>< 但後來發現 ~ 自訂功能非常豐富~ 其實非常方便 上一步這功能很好用 XD ~ 前一陣子看到VS 2010也有這功能 ~

但是目前還是有些問題存在~ 程式中,類別庫會使用到 LINUX C Libary, QT Libray, 自訂Libary
每次想要查詢LINUX Libary(就是跳至定義),時 都無法顯示~ 出現 man錯誤... 之後解決了再說吧~
對了 ~ 這之前還做了一件事 ~安裝 gcin 輸入法。
Fedora 預設安裝的輸入法是Ibus,但沒有新注音... 我也只會新注音所以囉~
安裝 gcin 輸入法


PS. 如果出現了網路無法連接~ 記的要選網路橋接(Bridge)