亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        基于ARM9與LINUX的RS485總線的通信接口設(shè)計(jì)

        2014-03-21 12:23:25雷瑞庭王健偉
        儀表技術(shù)與傳感器 2014年5期
        關(guān)鍵詞:發(fā)送數(shù)據(jù)驅(qū)動(dòng)程序串口

        宋 躍,楊 雷,雷瑞庭,王健偉,2

        (1.東莞理工學(xué)院電子工程學(xué)院,廣東東莞 523808;2.華南理工大學(xué)電子與信息學(xué)院,廣東廣州 510640)

        0 引言

        隨著ARM處理器應(yīng)用的范圍的不斷深入,根據(jù)需求的不同ARM提供的外設(shè)也越來(lái)越豐富,常用的通信接口有RS232、RS485、CAN、以太網(wǎng)等。RS485總線憑其傳輸距離遠(yuǎn)、抗干擾能力強(qiáng)、價(jià)格低廉等優(yōu)點(diǎn)在各種工業(yè)場(chǎng)合得到廣泛的應(yīng)用[1,2]。設(shè)計(jì)使用ARM9處理器S3C2440內(nèi)部集成的UART外設(shè)和RSM485模塊構(gòu)建具有電源隔離、電氣隔離、總線保護(hù)的RS485總線接口,通過(guò)對(duì)嵌入式Linux系統(tǒng)RS232驅(qū)動(dòng)程序的修改,使的在通過(guò)該修改后的串口驅(qū)動(dòng)程序發(fā)送數(shù)據(jù)時(shí),自動(dòng)控制IO來(lái)實(shí)現(xiàn)RS485通信的方向控制,從而簡(jiǎn)化了RS485通信的控制流程,Linux下RS485通信程序通過(guò)對(duì)該串口的讀寫(xiě),實(shí)現(xiàn)與RS485總線上的其他設(shè)備通信。

        1 通信接口的硬件設(shè)計(jì)

        S3C2440處理器片內(nèi)集成了豐富的外設(shè)資源,可以方便的實(shí)現(xiàn)嵌入式應(yīng)用中的各種接口通信。設(shè)計(jì)中用到了Samsung -ARM9-S3C2440,其片內(nèi)集成的3個(gè)UART,在設(shè)計(jì)中UART0用于嵌入式Linux操作系統(tǒng)的控制臺(tái)(console)接口,UART1作為RS232接口與其他RS232接口設(shè)備通信,UART3用作RS485的數(shù)據(jù)通信接口。由于ARM9處理器的IO電平與RS485的電氣標(biāo)準(zhǔn)不同,RS485采用差分信號(hào)負(fù)邏輯,+2~+6 V表示“0”,-6~-2 V表示“1”。為了達(dá)到RS485總線的電氣特性標(biāo)準(zhǔn),所以必須要外接電平轉(zhuǎn)換芯片[1,3-5],同時(shí)考慮工業(yè)應(yīng)用環(huán)境惡劣等因素,需要考慮RS485總線的電源隔離、電氣隔離、總線保護(hù)等因素,設(shè)計(jì)中用到廣州周立功的 RSM485模塊。

        RSM485隔離收發(fā)器模塊,是集成電源隔離、電氣隔離、RS485接口芯片,總線保護(hù)器件于一身。該模塊采用灌封工藝,具有很好的隔離特性,隔離電壓高達(dá)2500V DC,最多支持400個(gè)節(jié)點(diǎn),最高通信波特率115 200。

        圖1為系統(tǒng)中利用S3C2440中的UART2實(shí)現(xiàn)半雙工的RS485總線的原理圖,在同一時(shí)刻里數(shù)據(jù)只能往一個(gè)方向傳輸。其中的引腳CON為接收、發(fā)送控制腳,現(xiàn)在將其與S3C2440的IO引腳相連,由該引腳的電平控制芯片數(shù)據(jù)的方向。要發(fā)送數(shù)據(jù)時(shí)將其置0,接收數(shù)據(jù)時(shí)將其置1。

        圖1 S3C2440-485接口

        2 軟件設(shè)計(jì)

        2.1RS485通信設(shè)計(jì)

        圖2中首先打開(kāi)驅(qū)動(dòng)部分針對(duì)RS485通信修改過(guò)的串口2,設(shè)置其串口參數(shù),此時(shí)串口2處于RS485總線接收模式,然后向總線上第一個(gè)設(shè)備節(jié)點(diǎn)發(fā)送數(shù)據(jù)讀取指令,完成select函數(shù)調(diào)用初始化后,select函數(shù)根據(jù)用戶(hù)設(shè)定的超時(shí)時(shí)間,等待設(shè)備返回?cái)?shù)據(jù),若select函數(shù)返回異常,則重新進(jìn)行初始化,若在設(shè)定時(shí)間內(nèi),未接受到從設(shè)備的數(shù)據(jù),select函數(shù)返回超時(shí),則重設(shè)下一從設(shè)備節(jié)點(diǎn)等待超時(shí)時(shí)間,并發(fā)送下一設(shè)備數(shù)據(jù)讀取指令,重新進(jìn)入select等待設(shè)備返回?cái)?shù)據(jù);若在設(shè)定時(shí)間內(nèi),接到從設(shè)備返回?cái)?shù)據(jù),則從串口接收緩沖讀取數(shù)據(jù),并完成用戶(hù)協(xié)議數(shù)據(jù)解析,完成一次主從設(shè)備的數(shù)據(jù)通信,然后輪詢(xún)到下一設(shè)備。

        圖2 RS485通信軟件流程

        2.2RS485驅(qū)動(dòng)設(shè)計(jì)

        設(shè)計(jì)中使用ARM9處理器S3C2440內(nèi)部集成的UART外設(shè)和RSM485模塊構(gòu)建而成,其驅(qū)動(dòng)程序與RS232驅(qū)動(dòng)程序相比多了一個(gè)通信方向控制引腳的控制,所以在Linux操作系統(tǒng)中,完全可以借助內(nèi)核的串口驅(qū)動(dòng)添加方向控制IO相關(guān)代碼即可實(shí)現(xiàn)[4,6,7]。在linux2.6.32內(nèi)核源碼中,串口驅(qū)動(dòng)相關(guān)代碼在文件linux-2.6.32.2/drivers/seria/samsung.c中,為了實(shí)現(xiàn)RS485的通信,修改部分主要包括3個(gè)部分:

        (1)在串口驅(qū)動(dòng)的初始化代碼中加入RS485通信方向控制IO口設(shè)備的初始化工作,關(guān)鍵代碼片段為:

        if( port->line == 2) { //如果初始化的是串口2

        s3c2410_gpio_cfgpin(S3C2410_GPH0,S3C2410_GPH0_OUTP);//將GPG2,設(shè)為輸出功能

        s3c2410_gpio_setpin(S3C2410_GPH0,0);//設(shè)為高電平,使串口啟動(dòng)時(shí)處于接收數(shù)據(jù)狀態(tài)。

        RS485方向控制IO口初始化使用到了2個(gè)內(nèi)核函數(shù)(在arch/arm/plat-s3c24xx/gpio.c),其函數(shù)原型為:

        void s3c2410_gpio_cfgpin(unsigned int pin,unsigned int function)

        此函數(shù)的功能是設(shè)置引腳的功能,參數(shù)pin是要設(shè)置的引腳,對(duì)應(yīng)著是GPH0也即是S3C2410_GPH0引腳,參數(shù)function是要設(shè)置引腳的功能,設(shè)置中用到的是輸出功能,所以該值是S3C2410_GPH0_OUTP.

        void s3c2410_gpio_setpin(unsigned int pin,unsigned int x)

        此函數(shù)的功能是設(shè)置引腳的輸出值,參數(shù)pin是要設(shè)置的引腳,參數(shù)x是要設(shè)置引腳的輸出值0或者1.

        (2)在串口數(shù)據(jù)開(kāi)始發(fā)送前,將方向控制IO置0,使的RSM485處于發(fā)送狀態(tài),關(guān)鍵代碼片段如下:

        if( port->line == 2) {

        s3c2410_gpio_setpin(S3C2410_GPH0,1);//設(shè)為低電平,使串口啟動(dòng)時(shí)處于接收數(shù)據(jù)狀態(tài)。

        udelay(30);//等待方向IO控制腳狀態(tài)穩(wěn)定 }

        在設(shè)置方向控制IO口狀態(tài)后,加入一定延時(shí),等待方向IO控制腳狀態(tài)穩(wěn)定,避免出現(xiàn)由于方向控制狀態(tài)不穩(wěn)定導(dǎo)致發(fā)送數(shù)據(jù)出錯(cuò)。

        (3)在串口數(shù)據(jù)發(fā)送完成后,自動(dòng)進(jìn)入到數(shù)據(jù)接收模式,關(guān)鍵代碼片段為:

        if( port->line == 2) {

        while( !(rd_regl(port,S3C2410_UTRSTAT)&0x04) ) ;//等待串口發(fā)送完成,這句千萬(wàn)不能少

        s3c2410_gpio_setpin(S3C2410_GPH0,0);}

        由于S3C2440處理器自帶串口帶有硬件緩沖區(qū),串口驅(qū)動(dòng)中,數(shù)據(jù)發(fā)送完成是指數(shù)據(jù)已有驅(qū)動(dòng)程序全部寫(xiě)入到發(fā)送緩沖中,但此時(shí)串口數(shù)據(jù)并為正在發(fā)送出去,所以必須等待數(shù)據(jù)完全發(fā)送完成后,再將方向控制IO口置1。

        2.3Linux下RS485通信編程

        RS485驅(qū)動(dòng)程序修改完成后,可以像操作串口一樣操作RS485接口。在嵌入式Linux系統(tǒng)下,串口的設(shè)備文件位于/dev目錄下,可以使用文件打開(kāi)、讀寫(xiě)函數(shù)[2,8,9]直接操作RS485設(shè)備。設(shè)備打開(kāi)和讀寫(xiě)部分關(guān)鍵代碼片段為:

        int fd = open( Dev,O_RDWR | O_NOCTTY );//打開(kāi)設(shè)備

        ……

        nread = read(fd,s1_buf,64);//讀取設(shè)備數(shù)據(jù)

        ……

        write(fd,send_buff,6);//寫(xiě)入發(fā)送數(shù)據(jù)

        在設(shè)計(jì)中,ARM9作為RS485通信的主控設(shè)備與個(gè)從設(shè)備進(jìn)行通信,主控設(shè)備從每個(gè)從設(shè)備讀取數(shù)據(jù)時(shí),主設(shè)備先向該設(shè)備發(fā)送數(shù)據(jù)讀取命令,然后設(shè)備等待從設(shè)備返回?cái)?shù)據(jù)。所以在實(shí)際應(yīng)用中,因合理設(shè)置等待從設(shè)備返回?cái)?shù)據(jù)的等待時(shí)間。在設(shè)計(jì)中使用select函數(shù)來(lái)實(shí)現(xiàn)等待延時(shí),關(guān)鍵代碼為:

        switch(select(max_fd,&fds,NULL,NULL,&timeout)) //select使用

        {case -1:break;//select錯(cuò)誤,退出程序

        case 0:Find_endp(&pth_endp_line1);

        send_buff[1]= pth_endp_line1.index + 1;

        send_buff[4]= send_buff[1]+ 1;

        write(fd1,send_buff,6);

        timeout.tv_sec = time1;

        timeout.tv_usec = time2;

        break;//超時(shí),再次輪詢(xún)

        default:if(FD_ISSET(fd1,&fds)) //串口1數(shù)據(jù)

        {nread = read(fd1,s1_buf,64);

        if(nread >= 20)

        {i2c_led_set(8,1);

        Value_t = myrount(Value_t,100);

        Value_h = myrount(Value_h,100);

        Value_p = myrount(Value_p,100);

        Value_pt = myrount(Value_pt,100);

        } } }// end switch

        3 實(shí)驗(yàn)結(jié)果及應(yīng)用

        設(shè)計(jì)成功應(yīng)用到環(huán)境參數(shù)采集系統(tǒng)中,系統(tǒng)中主要有采集節(jié)點(diǎn)、采集終端、數(shù)據(jù)服務(wù)器組成,如圖3所示。采集節(jié)點(diǎn)負(fù)責(zé)完成氣壓、溫度、濕度參數(shù)的采集;采集終端通過(guò)RS485總線從分個(gè)采集節(jié)點(diǎn)讀取采集數(shù)據(jù),并通過(guò)以太網(wǎng)將采集數(shù)據(jù)上報(bào)到數(shù)據(jù)服務(wù)器;數(shù)據(jù)服務(wù)器完成數(shù)據(jù)的存儲(chǔ),并為其他形式的應(yīng)用提供應(yīng)用接口。在設(shè)計(jì)中主設(shè)備循環(huán)輪詢(xún)RS485總線上所有設(shè)備,每間隔1s主控設(shè)備ARM發(fā)送1次數(shù)據(jù)讀取指令,讀取指令中包含了從設(shè)備識(shí)別碼,符合識(shí)別碼的從設(shè)備立即返回采集數(shù)據(jù)。如果數(shù)據(jù)出錯(cuò)主設(shè)備將丟棄該數(shù)據(jù)包,等待下一次輪詢(xún),所以在通信程序設(shè)計(jì)時(shí)未考慮數(shù)據(jù)包錯(cuò)誤重發(fā)機(jī)制。設(shè)計(jì)達(dá)到預(yù)期目標(biāo)。盡管偶爾有誤碼出現(xiàn),但設(shè)計(jì)中避免了涉及l(fā)inux內(nèi)核復(fù)雜代碼的的修改,仍不失為有實(shí)用價(jià)值的設(shè)計(jì)方法。

        參考文獻(xiàn):

        [1]尤保常,楊源源,張曉,等.Linux環(huán)境下RS485通訊軟件開(kāi)發(fā)與界面設(shè)計(jì).自動(dòng)化儀表,2010,(12):22-25.

        圖3 RS485接口應(yīng)用

        [2]王志穎,馬衛(wèi)東.Linux系統(tǒng)下RS-485串行通信程序設(shè)計(jì).計(jì)算機(jī)應(yīng)用研究,2002,19(2):136-138.

        [3]穆斌,羅珣.RS485總線網(wǎng)絡(luò)應(yīng)用中的安全與可靠性.光學(xué)精密工程,2003,11(2):193-197.

        [4]謝輝,陳立萬(wàn).基于RS485網(wǎng)絡(luò)的智能通信系統(tǒng)設(shè)計(jì).自動(dòng)化與儀表,2009,24(10):23-25.

        [5]陳俊峰.姚建斌.鄭輝.智能小區(qū)控制總線測(cè)試系統(tǒng)的設(shè)計(jì).華北水利水電學(xué)院學(xué)報(bào),2010(1):70-72.

        [6]陳鼐,于盛林.基于S3C2410X的液晶屏接口設(shè)計(jì)與實(shí)現(xiàn).測(cè)控技術(shù),2006,25(12):68-71.

        [7]葉順流.基于ARM的嵌入式Linux研究與實(shí)現(xiàn):[學(xué)位論文].重慶:重慶大學(xué),2005.

        [8]江澤濤,吳俊安.用Kylix實(shí)現(xiàn)Linux環(huán)境下的串行通信.計(jì)算機(jī)應(yīng)用研究,2005,22(9):214-216.

        [9]S3C2410X 32-bit RISC microprocessor user's manual revision 1.2.SAMSUNG Electronics,2000:23-44.

        猜你喜歡
        發(fā)送數(shù)據(jù)驅(qū)動(dòng)程序串口
        移動(dòng)自組網(wǎng)中MAC層協(xié)議研究
        淺談AB PLC串口跟RFID傳感器的通訊應(yīng)用
        基于馬爾科夫鏈的LoRaWAN網(wǎng)絡(luò)節(jié)點(diǎn)性能分析
        帶標(biāo)記方式的CRDSA++協(xié)議性能分析*
        使用IPSec安全傳輸數(shù)據(jù)
        USB接口的多串口數(shù)據(jù)并行接收方法探索
        基于藍(lán)牙串口適配器的GPS接收機(jī)與AutoCAD的實(shí)時(shí)無(wú)線通信
        基于并行控制的FPGA多串口拓展實(shí)現(xiàn)
        驅(qū)動(dòng)程序更新與推薦
        驅(qū)動(dòng)程序更新與推薦
        91麻豆精品一区二区三区| 亚洲国产精品自产拍久久蜜AV| 国产精品国产三级国产AvkTV | 男女边吃奶边做边爱视频| 国产成人一区二区三区影院免费| 久久成人永久婷婷99精品| 亚洲中文字幕无码av永久| 亚洲精品字幕在线观看| 天天插天天干天天操| 日本免费影片一区二区| 久久精品国产亚洲av麻豆色欲| 中国猛少妇色xxxxx| 亚洲色婷婷综合开心网| 精品国产一区二区三区a| 五月天国产成人av免费观看| 伊伊人成亚洲综合人网7777| 精品亚洲人伦一区二区三区| 中文有码人妻字幕在线| 白丝兔女郎m开腿sm调教室| 福利视频黄| 亚洲中文字幕不卡一区二区三区 | 国产91精品清纯白嫩| 国产精品天天看天天狠| 少妇做爰免费视频网站| 国产成人精品麻豆| 一区二区三区在线观看人妖| 疯狂做受xxxx国产| 亚洲熟妇无码av不卡在线播放 | 在线视频色系中文字幕| 一本一道波多野结衣av中文| 91精品全国免费观看青青| 青青草在线免费观看在线| 久久人妻无码一区二区| 日韩一级特黄毛片在线看| 激情视频在线观看免费播放| 亚洲av片无码久久五月| 欧美丰满熟妇aaaaa片| 国产男女乱婬真视频免费| 亚洲熟女少妇精品综合| 乱人伦人妻中文字幕无码| 亚洲av日韩片在线观看|