基于ARM9 的嵌入式多串口服務(wù)器設(shè)計(jì)
3.1 在Linux 系統(tǒng)中對(duì)串口的操作
UART 的操作主要有: 數(shù)據(jù)發(fā)送、數(shù)據(jù)接收、產(chǎn)生中斷、設(shè)置波特率、loopback 模式、紅外模式和硬/軟流控模式7 部分。在Linux 中,所有設(shè)備文件一般都位于“/dev”下,其中串口對(duì)應(yīng)的設(shè)備為“/dev /ttySx”,在Linux 下對(duì)設(shè)備的操作方法與對(duì)文件的操作方法一樣。下面就是設(shè)計(jì)中串口應(yīng)用的開發(fā)步驟。
串口設(shè)置主要設(shè)置struct termios 結(jié)構(gòu)體成員,具體的串口操作函數(shù)此處略去,串口操作流程如圖6 所示。
3.2 Linux 網(wǎng)絡(luò)套接字編程步驟
在Linux 中的網(wǎng)絡(luò)編程通過socket 接口進(jìn)行。socket 是一種特殊的IO 接口,也是一種文件描述符,它是一種常用的進(jìn)程之間的通信機(jī)制,通過它不僅能實(shí)現(xiàn)本地機(jī)器上進(jìn)程間的通信,而且通過網(wǎng)絡(luò)能夠在不同機(jī)器上的進(jìn)程間進(jìn)行通信。
嵌入式串口服務(wù)器系統(tǒng)網(wǎng)絡(luò)套接字編程步驟如圖7 所示。
系統(tǒng)上電后,嵌入式服務(wù)器進(jìn)入Linux 系統(tǒng)并自動(dòng)運(yùn)行裝載在其內(nèi)的server 程序。作為服務(wù)器, server 程序在開始運(yùn)行時(shí)就為每一個(gè)打開的串口創(chuàng)建recvpcwritearm 和readarmsendpc 線程,并在網(wǎng)絡(luò)連接正常以及客戶端沒有執(zhí)行關(guān)閉串口的操作時(shí),每一個(gè)已打開串口對(duì)應(yīng)的兩個(gè)線程將不會(huì)結(jié)束,這樣在系統(tǒng)滿負(fù)荷運(yùn)行時(shí),系統(tǒng)將同時(shí)開啟4 個(gè)線程。嵌入式串口服務(wù)器主程序流程如圖8 所示,主函數(shù)實(shí)現(xiàn)套接字的初始化工作,建立兩路監(jiān)聽套接字,分別初始化線程recvpcwritearmsocket[3000 + com]套接字和readarmsendpc socket[4000 + com]套接字com 為串行端口號(hào)。一旦接收到客戶端的連接請(qǐng)求,判斷客戶端請(qǐng)求的方式后,啟用相應(yīng)的進(jìn)程函數(shù)進(jìn)行數(shù)據(jù)處理。
4 試驗(yàn)
4.1 數(shù)據(jù)上行測(cè)試
數(shù)據(jù)上行測(cè)試指串口設(shè)備發(fā)送信息到嵌入式串口服務(wù)器,通過嵌入式串口服務(wù)器將數(shù)據(jù)從以太網(wǎng)口傳輸出去??紤]實(shí)際使用過程中上行數(shù)據(jù)量較大,為了模擬工業(yè)現(xiàn)場(chǎng)接收大量的數(shù)據(jù),以“1234567890abcdefghijklmnopqrstuvwsyz”構(gòu)成的數(shù)據(jù)包進(jìn)行模擬。
測(cè)試方法為每秒鐘連續(xù)不斷地發(fā)送“1234567890abcdefghijklmnopqrstuvwsyz”,使之構(gòu)成100KByte 的數(shù)據(jù)包,觀察客戶端程序能否正常收到這個(gè)數(shù)據(jù)包。試驗(yàn)測(cè)試結(jié)果如圖9 所示,當(dāng)從“終端串口設(shè)備”向上位機(jī)發(fā)送100KByte 數(shù)據(jù)時(shí),在客戶端一側(cè)正常收到了這些數(shù)據(jù),并且沒有丟失現(xiàn)象。
4.2 數(shù)據(jù)下行測(cè)試
數(shù)據(jù)下行測(cè)試指通過工控機(jī)上的以太網(wǎng)口發(fā)送數(shù)據(jù)給串口服務(wù)器,串口服務(wù)器接收以太網(wǎng)數(shù)據(jù)幀并進(jìn)行格式轉(zhuǎn)換,同時(shí)判斷發(fā)往指定的串口設(shè)備。在實(shí)際使用過程中,上位機(jī)發(fā)送到串行終端設(shè)備的數(shù)據(jù)量較小,這些數(shù)據(jù)一般都是由操作人員輸入的數(shù)據(jù),因此可以用單個(gè)數(shù)據(jù)流“1234567890abcDefghijklmnopqrstuvwxyz”進(jìn)行測(cè)試。
測(cè)試方法是利用運(yùn)行在PC 機(jī)上的客戶端程序每秒鐘發(fā)送連續(xù)數(shù)據(jù)流,觀察另一臺(tái)PC 機(jī)上串口調(diào)試助手是否正常接收到數(shù)據(jù)。試驗(yàn)測(cè)試結(jié)果如圖10 所示,當(dāng)客戶端程序發(fā)送數(shù)據(jù)時(shí),在終端串口設(shè)備上得到同樣的數(shù)據(jù)流。
5 結(jié)束語
筆者利用完全開源的Linux 操作系統(tǒng),將其移植、裁剪后設(shè)計(jì)嵌入式串口服務(wù)器系統(tǒng),選用非常適用于通信產(chǎn)品中的ARM9 內(nèi)核的S3C2440A 微處理器和DM9000AEP 芯片擴(kuò)展了100MByte 自適應(yīng)以太網(wǎng)口,完成了硬件平臺(tái)設(shè)計(jì); 然后用多線程網(wǎng)絡(luò)套接字編寫串口服務(wù)器程序,完成多串口服務(wù)器的軟件設(shè)計(jì)。最后用試驗(yàn)證實(shí)了多串口服務(wù)器能夠很好地完成串口數(shù)據(jù)與以太網(wǎng)口數(shù)據(jù)的雙向傳輸,成功地將現(xiàn)有的串行通信設(shè)備接入以太網(wǎng),利用網(wǎng)絡(luò)實(shí)現(xiàn)數(shù)據(jù)的遠(yuǎn)程傳輸與遠(yuǎn)程監(jiān)控功能,實(shí)時(shí)監(jiān)控設(shè)備的運(yùn)行狀態(tài)。降低了設(shè)備的維修費(fèi)用,縮短了開發(fā)周期。該產(chǎn)品基于開放標(biāo)準(zhǔn)設(shè)計(jì),易于升級(jí)與維護(hù),具有廣闊的應(yīng)用前景。
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)linux相關(guān)文章:linux教程
tcp/ip相關(guān)文章:tcp/ip是什么
評(píng)論