<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應用 > Linux串口上網(wǎng)的程序?qū)崿F(xiàn)方法

          Linux串口上網(wǎng)的程序?qū)崿F(xiàn)方法

          作者: 時間:2011-05-10 來源:網(wǎng)絡(luò) 收藏

          提供了豐富的支持,比如PPP(Peer-to-Peer Protocol, 端對端協(xié)議)和SLIP(Serial Line Interface Protocol, 非常老的串行線路接口協(xié)議)。

          本文引用地址:http://www.ex-cimer.com/article/150775.htm

          這里所說的是指把當成一個網(wǎng)絡(luò)接口,通過封裝網(wǎng)絡(luò)數(shù)據(jù)包(如IP包)以達到無網(wǎng)卡的終端可以通過進行網(wǎng)絡(luò)通信。但是使用這兩種協(xié)議必須得到內(nèi)核的支持。例如,如果在沒有配置PPP的環(huán)境中使用PPP,除了安裝PPP應用層軟件外,還必須重新編譯內(nèi)核。SLIP是一個比較老的簡單的協(xié)議,現(xiàn)在的內(nèi)核缺省配置都支持,不需要重新編譯內(nèi)核,盡管如此,其源代碼看上去有點古怪而復雜。在嵌入式Linux系統(tǒng)使用過程中,如果內(nèi)核已經(jīng)被燒入Flash中,而為了節(jié)省空間內(nèi)核又沒有提供諸如PPP或者SLIP的支持,當然就沒有辦法在不重新燒寫Flash的情況下直接使用PPP或者SLIP了,事實上用戶必須動態(tài)加載PPP和SLIP的內(nèi)核模塊。對某些嵌入式應用來說移植或者修改PPP源代碼變成了乏味和繁鎖的工作。這里介紹一種非常經(jīng)濟而且實用的串口的簡單。

          Linux簡單串口上網(wǎng)原理

          簡單串口上網(wǎng)的原理如圖1所示。


          圖 1

          Linux Box A 和 Linux Box B 是兩個安裝有Linux操作系統(tǒng)的終端(可以是PC,也可以是嵌入式設(shè)備),它們通過一條串口通信線(null modem cable line)連接。控制串口通信的服務進程server讀和寫兩個字符設(shè)備:發(fā)送字符設(shè)備sending device和接收字符設(shè)備receiving device。

          在內(nèi)核空間,偽網(wǎng)絡(luò)設(shè)備驅(qū)動pseudo network driver可以直接讀寫發(fā)送字符設(shè)備和接收字符設(shè)備,事實上在內(nèi)核空間它們之間的通信只是對共享緩存區(qū)的讀寫而已。偽網(wǎng)絡(luò)設(shè)備驅(qū)動具有大部分普通網(wǎng)卡驅(qū)動提供服務功能,只是沒有硬件部分代碼的實現(xiàn)而已。當用戶空間的進程要發(fā)送數(shù)據(jù)的時候,其首先讓數(shù)據(jù)經(jīng)過Linux操作系統(tǒng)的TCP/IP處理層進行數(shù)據(jù)打包,然后把打包后的數(shù)據(jù)直接寫入sending device,等待server進程讀取,最后通過串口發(fā)送到另一個Linux Box的server進程;而當server進程發(fā)現(xiàn)有數(shù)據(jù)從串口傳送過來時就把數(shù)據(jù)寫入receiving device,偽網(wǎng)絡(luò)驅(qū)動程序發(fā)現(xiàn)receiving device設(shè)備有新數(shù)據(jù)的時候,就又把數(shù)據(jù)傳遞到TCP/IP層處理,最終網(wǎng)絡(luò)應用程序收到對方發(fā)來的數(shù)據(jù)。本文設(shè)計的源程序主要有三個,ed_device.c、ed_device.h、server.c。其中在ed_device.c是串口上網(wǎng)的內(nèi)核部分的主程序,包含字符設(shè)備和偽網(wǎng)絡(luò)接口設(shè)備程序,server.c負責串口通信。主文件ed_device.c中包括的頭文件在源程序中,這里就不一一列舉了。

          Linux串口上網(wǎng)設(shè)備加載和注銷形式

          Linux串口上網(wǎng)程序的整個內(nèi)核部分是以LKM(Loadable Kernel Module)形式實現(xiàn)的。LKM加載的時候完成偽網(wǎng)絡(luò)設(shè)備、發(fā)送字符設(shè)備、接收字符設(shè)備的初始化和注冊。注冊的目的是讓操作系統(tǒng)可以識別用戶進程所要操作的設(shè)備,并完成在其上的操作(比如read,write等系統(tǒng)調(diào)用)。Linux加載模塊,實際上就是模塊鏈表的插入;刪除模塊象是模塊鏈表成員的刪除。

          初始化內(nèi)核模塊入口函數(shù)init_module()中包括對字符設(shè)備的初始化入口 函數(shù)eddev_module_init()和偽網(wǎng)絡(luò)設(shè)備初始化入口函數(shù)ednet_module_init()。

          在內(nèi)核需要卸載的時候,必須進行資源釋放以及設(shè)備注銷, cleanup_module()完成這個任務。函數(shù)cleanup_module()中用eddev_module_cleanup()來釋放字符設(shè)備占用的資源(比如分配的緩存區(qū)等);有ednet_module_cleanup()來釋放偽網(wǎng)絡(luò)設(shè)備占用的資源。本文的內(nèi)核部分模塊程序編譯后就是ed_device.o,加載后使用lsmod命令查看,模塊名就是ed_device。模塊ed_device的加載和注銷函數(shù)如圖2所示。


          圖 2

          當我們需要加載模塊的時候,我們只需要使用insmod命令,如果需要卸載模塊,我們使用rmmod命令。比如加載ed_device模塊,并且配置偽網(wǎng)絡(luò)接口IP地址為192.168.5.1

          [root@localhost test]insmod ed_device.o,

          [root@localhost test]ifconfig ed0 192.168.5.1 up

          這時可以在/proc/net/dev 文件中看到有ed0偽網(wǎng)絡(luò)設(shè)備了。如果需要卸載ed_device模塊,應先停止其網(wǎng)絡(luò)數(shù)據(jù)發(fā)送和接收工作,然后卸載模塊:

          [root@localhost test]ifconfig ed0 down

          [root@localhost test]rmmod ed_device

          linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)

          linux相關(guān)文章:linux教程



          上一頁 1 2 3 4 5 下一頁

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();