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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 基于RS485的PC與ARM之間文件傳輸?shù)膶崿F(xiàn)

          基于RS485的PC與ARM之間文件傳輸?shù)膶崿F(xiàn)

          作者: 時間:2016-12-19 來源:網(wǎng)絡 收藏

            1. 引言

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

            在產(chǎn)業(yè)控制場合中,常會要求通過PC向嵌進式微機傳輸圖片文件、數(shù)據(jù)文件等。由于價格便宜、操縱簡單、使用者可以隨意編寫應用協(xié)議等優(yōu)點,被廣泛應用在中等長間隔的控制通訊中。因此,利用實現(xiàn)PC到嵌進式系統(tǒng)的文件傳輸,十分具有現(xiàn)實意義。

            本文以基于9的三星S3C2410A為嵌進式微處理器,嵌進式Linux為嵌進式操縱系統(tǒng)搭建一個嵌進式系統(tǒng),成功實現(xiàn)了PC通過向嵌進式系統(tǒng)傳輸文件。

            2. RS485接口先容

            RS485是一種多點、雙向、平衡傳輸規(guī)范,被命名為TIA/EIA-485-A標準。

            RS485由RS232發(fā)展而來,它改進了RS232通訊間隔短、速率低的缺點。RS485是一種平衡通訊接口,傳輸速率最高可達10Mbit/s,最大傳輸間隔約為1219m,并答應在一條平衡總線上連接最多32個設備。RS485的共模輸出電壓是-7V~+12V[5]。

            3. 硬件設計

            本文采用Friendly公司的Nano2410V2核心板作為中心處理器模塊,并配以外圍電路。Nano2410V2核心板以S3C2410A為CPU[1]。

            把S3C2410A的UART0分配給RS485總線,由芯片MAX485完成TTL到差分信號的轉(zhuǎn)換,RS485方向控制線占用GPB2,如圖1所示[2]。

              

           

            圖1 硬件連線圖

            PC上使用RS232/RS485轉(zhuǎn)換器,完成RS232到RS485的轉(zhuǎn)換。

            4. RS485驅(qū)動程序

            RS485標準只對接口的電氣特性作出規(guī)定,而不涉及插件、電纜或協(xié)議[5]。因此,在Linux下使用RS485接口,可借助串口驅(qū)動程序?qū)崿F(xiàn)。但是,RS485是半雙工的,比起RS232,需要多加一個I/O口來控制RS485的方向,該I/O口在發(fā)送數(shù)據(jù)時置高,接收數(shù)據(jù)時置低。

            發(fā)送數(shù)據(jù):

            ioctl(fd485, 1, 0); //fd485:方向控制I/O口驅(qū)動設備文件的fd

            write(fdtty, &bufout, 1); //fdtty:串口驅(qū)動設備文件的fd

            delay();

            讀取數(shù)據(jù):

            ioctl(fd485, 0, 0);

            read(fdtty, &bufin, 1) ;

            方向控制線的驅(qū)動程序設計:

            定義file_operatiONs[3][4]:

            static struct file_operations io485_fops=

            {

            owner:THIS_MODULE,

            ioctl:io485_ioctl

            };

            函數(shù)io485_ioctl用于設置RS485接口的方向:cmd為0時,設為輸進;cmd為1時,設為輸出[3][4]。

            static int io485_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)

            {

            switch(cmd)

            {

            case 0:

            case 1:

            write_gpio_bit(GPIO_B2, cmd);

            return 0;

            default:

            return -EINVAL;

            }

            }

            5. 自定義數(shù)據(jù)幀格式

            在這里數(shù)據(jù)幀格式指的是發(fā)送方發(fā)送一個文件或者接收方接收一個文件的完整過程所需要的每一個字節(jié)元素的含義[5]。

            本文定義格式如下:

            (1) 開始符:標志開始傳輸文件,1個字節(jié)。

            (2) 文件名長度:所傳輸文件的文件名的長度,1個字節(jié)。

            (3) 文件名:所傳輸文件的文件名,字節(jié)數(shù)由文件名長度決定。

            (4) 文件大?。核鶄鬏斘募拇笮?,4個字節(jié)。

            (5) 文件內(nèi)容:所傳輸文件的數(shù)據(jù),字節(jié)數(shù)由文件大小決定。

            (6) ACK:確認信號。接收方給發(fā)送方的反饋信號,表示數(shù)據(jù)接收完成,1個字節(jié)。

            6. 程序流程

            本文對于傳輸文件,采用的方法為:發(fā)送端打開要傳輸?shù)奈募?,讀取文件數(shù)據(jù),然后通過串口向外發(fā)送;接收端先建立一個空文件,然后把從RS485接口讀到的內(nèi)容寫進該文件里。

            數(shù)據(jù)校驗:為防止文件數(shù)據(jù)在傳輸?shù)倪^程中,丟失或出錯,進行校驗是必要的。在這里,采用的校驗方法是:發(fā)送端每發(fā)送n個字節(jié),就取1個字節(jié)作為校驗字節(jié)。該字節(jié)是前n個字節(jié)異或運算的結(jié)果;接收端每接收n個字節(jié),就對該n個字節(jié)進行異或運算,并把結(jié)果與校驗字節(jié)作比較,相同則傳輸繼續(xù)進行,不同則要求發(fā)送端重新發(fā)送。

            在本文中,作為文件接收方,PC作為文件發(fā)送方,接收方程序流程圖如圖5所示,發(fā)送方的程序流程與接收方互補即可。

              

           

            圖2 程序流程圖

            7. 結(jié)語

            通過PC向嵌進式微機傳輸文件在嵌進式系統(tǒng)應用中經(jīng)常需要。而RS485由于其突出優(yōu)點,廣泛應用在產(chǎn)業(yè)控制中。因此通過RS485實現(xiàn)PC到嵌進式系統(tǒng)的文件傳輸,十分具有現(xiàn)實意義。

            本文作者創(chuàng)新點:提出了一種簡單的RS485驅(qū)動程序設計方法,并以一種簡單、實用、可靠的方法成功實現(xiàn)了PC通過RS485向ARM傳輸文件。



          關(guān)鍵詞: RS485 ARM

          評論


          相關(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); })();