曲成華
摘要:雷達(dá)天線的控制系統(tǒng)與雷達(dá)任務(wù)處理系統(tǒng)之間的通信多采用串口通信方式,交互的內(nèi)容包括雷達(dá)天線方位、狀態(tài)和對(duì)天線的控制命令等。該文先介紹了串口及l(fā)inux串口設(shè)備文件,然后詳細(xì)設(shè)計(jì)了Linux系統(tǒng)下的串口編程以及需要注意的相關(guān)參數(shù)設(shè)置。經(jīng)長(zhǎng)期運(yùn)行證明,該設(shè)計(jì)能夠滿(mǎn)足數(shù)據(jù)交互的要求并具有相當(dāng)高的可靠性。
關(guān)鍵詞:Linux系統(tǒng);串口通信;串口設(shè)置;雷達(dá);天線方位
中圖分類(lèi)號(hào):TP391文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1009-3044(2012)12-2908-04
Design of the Radar Azimuth Data Exchange Based on Serial Conminucation in Linux
QU Cheng-hua
(The 38thResearch Institute of CETC, Hefei 230088, China)
Abstract: The communication between radar antenna control system and radar-tasking system ulually uses serial communication; the inter? action data includes radar antenna azimuth, status and the radar antenna control commands, etc. This paper described the seial ports and Linux serial device file, and then designed Linux system serial programming, as well as the need to pay attention to the relevant parameter settings. It is proved this design could meet the requirements of data exchange and had a very high reliability.
Key words: Linux system ; serial port data communation; serial port set; radar antenna; azimuth
在某海關(guān)監(jiān)視雷達(dá)中,雷達(dá)天線的控制系統(tǒng)與雷達(dá)任務(wù)處理系統(tǒng)之間需要采用串口通信方式,且為滿(mǎn)足系統(tǒng)長(zhǎng)時(shí)間工作的需要,要求任務(wù)處理系統(tǒng)運(yùn)行在Linux操作系統(tǒng)。任務(wù)處理系統(tǒng)需要實(shí)時(shí)接收雷達(dá)天線當(dāng)前方位和狀態(tài)信息,并發(fā)送天線控制命令給天線控制系統(tǒng)。本雷達(dá)的總體設(shè)計(jì)中,信號(hào)處理系統(tǒng)生成的雷達(dá)點(diǎn)跡情報(bào)沒(méi)有方位信息,這就要求任務(wù)處理系統(tǒng)接收的方位信息間隔非常短,經(jīng)綜合考慮和多次實(shí)驗(yàn),確定天線方位的數(shù)據(jù)周期為15毫秒,因此需要對(duì)linux系統(tǒng)下的串口通信進(jìn)行優(yōu)化設(shè)計(jì)以滿(mǎn)足高數(shù)據(jù)率的要求。
1串口簡(jiǎn)介
串行接口簡(jiǎn)稱(chēng)串口,也稱(chēng)為串行通信接口,是采用串行通行方式的擴(kuò)展接口,數(shù)據(jù)一位一位地順序傳送,其特點(diǎn)是通信線路簡(jiǎn)單,并可以利用電話線進(jìn)行遠(yuǎn)距離通信,但是傳送速度較慢。根據(jù)信息的傳送方向,串行通信可以進(jìn)一步分為單工、半雙工和全雙工三種。串口通信具有兩種最基本的方式:同步串行通信方式和異步串行通信方式。串行接口按電氣標(biāo)準(zhǔn)分為RS-232-C、RS-422、RS485等,這種分類(lèi)方法僅對(duì)接口的電氣特性作出規(guī)定,不涉及接插件、電纜或協(xié)議。由于串口(COM)不支持熱插拔及傳輸數(shù)率較低,目前串口多用于工控和測(cè)量設(shè)備以及部分通信設(shè)備中。
2 Linux串口設(shè)備文件
Linux的文件系統(tǒng)是操作系統(tǒng)的重要組成部分之一,和其他操作系統(tǒng)一樣用于管理和存儲(chǔ)文件。Linux將所有的軟件、硬件都作為文件來(lái)管理,每個(gè)文件被保存在特定的目錄中,目錄中還可以包含子目錄,子目錄中還可以包含文件和其他子目錄。Linux有四種基本的文件類(lèi)型:普通文件、目錄文件、設(shè)備文件、連接和特殊文件。Linux將所有的設(shè)備都用文件來(lái)表示,大多數(shù)設(shè)備文件都放在/dev目錄中,它們的內(nèi)容就是所有設(shè)備名的一個(gè)完整清單。這里,設(shè)備名Hd代表IDE硬盤(pán)驅(qū)動(dòng)器,sd代表SCSI硬盤(pán)驅(qū)動(dòng)器,sr代表SCSI CD-ROM驅(qū)動(dòng)器,fd代表軟盤(pán)驅(qū)動(dòng)器,tty代表終端,lp代表打印機(jī)。ttySN就表示第N個(gè)串口。對(duì)串口的操作也就是對(duì)串口設(shè)備文件的操作,如open()、read()、write()、close()等。Linux內(nèi)核提供給用戶(hù)進(jìn)程一個(gè)設(shè)備節(jié)點(diǎn),如/dev/ttyS0,并提供標(biāo)準(zhǔn)的文件系統(tǒng)接口,用戶(hù)可以用操作普通文件一樣操作終端設(shè)備;用戶(hù)的操作必須經(jīng)過(guò)稱(chēng)為終端行規(guī)范( terminal line discipline)的模塊中進(jìn)行規(guī)范處理;最后終端設(shè)備對(duì)應(yīng)的驅(qū)動(dòng)程序?qū)K端設(shè)備進(jìn)行操作。
3通信編程設(shè)計(jì)
本節(jié)首先結(jié)合該海關(guān)雷達(dá)的總體設(shè)計(jì)進(jìn)行數(shù)據(jù)流程設(shè)計(jì),然后對(duì)終端標(biāo)準(zhǔn)接口進(jìn)行解釋?zhuān)詈蠼o出Linux系統(tǒng)串口編程的一般步驟和關(guān)鍵的軟件代碼。
3.1數(shù)據(jù)處理流程設(shè)計(jì)
在該雷達(dá)中,任務(wù)處理系統(tǒng)通過(guò)CPCI總線從信號(hào)處理分系統(tǒng)中獲取點(diǎn)跡信息,該點(diǎn)跡信息不具有方位信息,需要任務(wù)處理系統(tǒng)在收到點(diǎn)跡時(shí)根據(jù)當(dāng)前的天線方位給點(diǎn)跡方位賦值,因此要求任務(wù)處理系統(tǒng)接收的方位信息間隔非常短才能有效的降低點(diǎn)跡方位誤差??紤]Linux系統(tǒng)是多用戶(hù)多任務(wù)的操作系統(tǒng),設(shè)計(jì)獨(dú)立的線程來(lái)進(jìn)行天線方位處理,從串口中讀取數(shù)據(jù)并進(jìn)行報(bào)文解釋處理,在每成功取得一組天線方位數(shù)據(jù)后,線程休眠15毫秒,釋放CPU資源給其他進(jìn)程和線程處理。
termios結(jié)構(gòu)共5個(gè)成員變量,其中c_iflag用來(lái)控制終端設(shè)備驅(qū)動(dòng)程序的輸入,c_oflag用來(lái)控制驅(qū)動(dòng)程序的輸出,c_cflag用來(lái)描述基本的終端硬件控制,c_lflag控制驅(qū)動(dòng)程序與用戶(hù)之間的接口,c_cc數(shù)組定義特殊控制字符,控制串口的元數(shù)個(gè)數(shù)。
串口操作的主要控制函數(shù)如表1所示。其中tcgetattr和tcsetattr函數(shù)中返回的結(jié)果就是termios類(lèi)型,tcgetattr函數(shù)用于獲取終端的相關(guān)參數(shù),tcsetattr函數(shù)則用于設(shè)置終端參數(shù)。這些函數(shù)提供了對(duì)串口的有效控制和操作,完成串口設(shè)備數(shù)據(jù)傳輸處理功能。
在設(shè)置串口屬性時(shí)需要取出原屬性,如果要設(shè)置某個(gè)選項(xiàng),那么就使用"|="運(yùn)算,如果關(guān)閉某個(gè)選項(xiàng)就使用"&="和"~"運(yùn)算。
表1串口操作函數(shù)
3.3.1打開(kāi)串口
在Linux中,打開(kāi)串口設(shè)備和打開(kāi)普通文件一樣,使用的是open函數(shù)。串口名從ttyS0開(kāi)始依次為ttyS1、ttyS2等。在本程序中,使用ttyS0作為通信串口。
iDeviceID = open("/dev/ttyS0", O_RDWR | O_NOCTTY |O_NDELAY);
"/dev/ttyS0"表示打開(kāi)串口ttyS0;選項(xiàng)O_RDWR表示可以進(jìn)行讀操作和寫(xiě)操作,O_NOCTTY表示不能把本串口當(dāng)成控制終端,否則用戶(hù)的鍵盤(pán)輸入信息將影響程序的執(zhí)行;O_NDELAY表示打開(kāi)串口的時(shí)候不關(guān)心DCD信號(hào)線狀態(tài),即不關(guān)心另一端的串口是否在使用中,否則會(huì)在DCD信號(hào)線為低電平時(shí)停止。
3.3.2設(shè)置串口屬性
串口打開(kāi)后還需要對(duì)串口進(jìn)行屬性配置即對(duì)termios結(jié)構(gòu)體中的成員進(jìn)行設(shè)置才能正常傳輸和接收數(shù)據(jù)。總體原則是傳輸方式設(shè)置為原始方式以實(shí)現(xiàn)實(shí)時(shí)通信,不對(duì)輸入和輸出字符進(jìn)行任何處理,不等待字符匯聚成一行,而是立即讀寫(xiě)串口。在設(shè)置串口屬性前,需要保留原來(lái)的串口設(shè)置屬性,以便在關(guān)閉串口前恢復(fù)。
串口設(shè)置的屬性主要包括波特率、數(shù)據(jù)位、停止位、校驗(yàn)位和其他一些屬性。
1)波特率設(shè)置
在串口傳輸中,用波特率來(lái)表示傳輸?shù)乃俣龋?波特表示在1秒鐘內(nèi)可以傳輸1個(gè)比特。波特率有B115200,B57600,B38400,B19200,B9600,B4800,B2400,B1200,B600,B300等多種常用的選項(xiàng),需要對(duì)輸入和輸出的波特率進(jìn)行設(shè)置。獲得端口波特率信息是通過(guò)cfgetispeed函數(shù)和cfgetospeed函數(shù)來(lái)實(shí)現(xiàn)的,設(shè)置端口的輸入/輸出波特率是通過(guò)cfsetispeed函數(shù)和cfsetospeed函數(shù)來(lái)實(shí)現(xiàn)。一般情況下,輸入和輸出波特率是相等的。函數(shù)原型如下所示
3.3.3數(shù)據(jù)接收與發(fā)送
接收數(shù)據(jù)只需調(diào)用read函數(shù)即可。Ret = read (iDeviceID,buf,N); N表示一次讀取的數(shù)據(jù)個(gè)數(shù)。串口默認(rèn)的打開(kāi)方式是非阻塞的,因此本函數(shù)只是接收緩沖中的數(shù)據(jù),而并非直接操作IO。如果緩沖中有接收到的數(shù)據(jù),那么本函數(shù)將返回實(shí)際接收到的數(shù)據(jù)長(zhǎng)度,當(dāng)然不會(huì)超過(guò)指定的N個(gè)字節(jié)。如果緩沖中沒(méi)有數(shù)據(jù),那么將返回0。如果接收失敗,那么將返回-1,錯(cuò)誤代碼放在errno中。
發(fā)送數(shù)據(jù)只需調(diào)用write函數(shù)即可。ret = write(iDeviceID,buf,N);返回值表示實(shí)際發(fā)送的數(shù)據(jù)長(zhǎng)度。
3.3.4串口屬性還原和關(guān)閉串口
在使用完串口后,需要還原串口原有的屬性并關(guān)閉串口,設(shè)置如下所示。