新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于uCLinux和ARM7的網絡通信設計

        基于uCLinux和ARM7的網絡通信設計

        作者: 時間:2013-04-12 來源:網絡 收藏


        *struct sockaddr:用來保存socket信息

        struct sockaddr{unsigned short sa_family;/*地址族,AF_xxx*/

        char sa_data[14]; /*14字節的協議地址*/};

        *struct sockaddr_in;和來進行數據類型的轉換

        struct sockaddr_in{

        short int sin_family; /*地址族*/

        unsigned short int sin_port; /*端口號*/

        sruct in_addr sin_addr; /*IP地址*/

        unsigned cha sin_zero[8]; /*填充0,以保持與struct sockaddr同樣大小*/};

        至此,可經編出工程程序。在此給出部分下實現源代碼及其Makefile文件的編寫實例。

        main()函數中部分代碼如下:

        int sockfd;

        unsigned int uiip;

        char szsendbuf[1024];

        char head[8];

        int*phead=head+4,nsize=1024,allsize=0;

        struct sockaddr_in servaddr;

        sockfd=socket(AF_INET,SOCK_STREAM,0);/*創建socket*/

        bzero(servaddr,sizeof(struct sockaddr_in));

        servaddr.sin_family=AF_INET;

        servaddr.sin_port=8888;//htons(8888); /*指定通信端口*/將命令行輸入的字符串IP轉換為connect函數可識別的整數uiip。本來在Linux上開發時可以使用C庫函數inet_pton(),但在的庫中不支持該函數,因此只好自己實現該函數的功能。

        aiptoi()如下所示:

        aiptoi(argv[1],uiip);

        servaddr.sin_addr.s_addr=uiip; /*指定連接的對端IP*/

        connect(sockfd,(struct sockaddr)servaddr,sizeof(struct sockaddr));

        /*連接對端接收代碼*/

        fp=fopen("kongzhi.htm","r"); /*打開控制頁面*/

        while(nsize==1024)

        {bzero(szsendbuf,1024); /*每次從文件中讀取巧024個字節發送出去,若讀出少于1024字節結束*/

        nsize=phead=fread(szsendbuf,1,1024,fp);/*從文件中讀取并填入發送BUFFER中*/

        write(sockfd,head,8);/*發送協議頭*/
        nsize=write(sockfd,szsendbuf,nsize);/*發送*/}

        fclose(fp);

        uCLinux中的Makefile需做的修改如下:

        CC=gcc

        COFF2FLAT=/uclinux/coff2flt-0.3/coff2flt

        CFLAGS=-I/uclinux/uC-libc-pic/include

        LDFLAGS=/uclinux/uC-libc-pic/libc.a

        ethernet:Ethernet.o

        $(CC)-o $@.coff ethernet.c $(CFLAGS)$(LDFLAGS)

        $(COFF2FLAT)-o Ethernet ethernet.coff

        cp Ethernet /Ethernet

        clean:

        rm -f Ethernet Ethernet.o

        需要注意的是:①uCLinux中不帶有pthread庫,在編寫網絡程序要切記;②在uCLinux環境下,處理器(硬件)和內核黃素(軟件)均不提供內存管理機制,所以程序的地址空間等同于內存的物理地址空間。在程序中可直接對I/O地址進行操作,而不需要申請和釋放I/O空間,但需要用戶自己來檢查所操作的I/O地址的占用情況。

        結語

        由于工程廣泛應用在嵌入式設備中,以往的文章只是泛泛地敘述網絡通信設計的某一個方面。本文結合實際工程項目,從硬件電路的搭建、應用軟件的設計要點。這對于在嵌入式設備中,特別是基于uCLinux的系統中應用網絡通信有重要的參考意義。


        參考文獻:
        [1]. datasheet http://www.dzsc.com/datasheet/_589499.html.
        [2]. DM9161 datasheet http://www.dzsc.com/datasheet/DM9161_264516.html.
        [3]. RISC datasheet http://www.dzsc.com/datasheet/RISC_1189725.html.
        [4]. ARM7TDMI datasheet http://www.dzsc.com/datasheet/ARM7TDMI_139812.html.
        [5]. RTL8201 datasheet http://www.dzsc.com/datasheet/RTL8201_586322.html.
        [6]. 100M datasheet http://www.dzsc.com/datasheet/100M_2509927.html.
        linux操作系統文章專題:linux操作系統詳解(linux不再難懂)

        linux相關文章:linux教程


        數字通信相關文章:數字通信原理


        通信相關文章:通信原理



        上一頁 1 2 3 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 昌都县| 石嘴山市| 合肥市| 烟台市| 山丹县| 霍邱县| 禹城市| 江永县| 凌云县| 德兴市| 漳平市| 新巴尔虎左旗| 宜君县| 昌邑市| 温泉县| 洛川县| 东明县| 泾川县| 庐江县| 什邡市| 交口县| 大关县| 宁国市| 益阳市| 错那县| 吴江市| 西昌市| 敖汉旗| 苏尼特左旗| 来凤县| 大港区| 门源| 绩溪县| 井冈山市| 永顺县| 洪江市| 高青县| 江山市| 交口县| 延边| 宁陵县|