基于嵌入式的變電站蓄電池遠程監測平臺的設計與實(shí)現
2CM模塊端的通信軟件設計與實(shí)現
軟件的設計主要是模塊之間數據的交換及處理,CM模塊端即ARM上的軟件設計包括兩大部分。一是與TM模塊的通信,采用傳統系統中的現場(chǎng)總線(xiàn)RS485進(jìn)行串口數據通信。接收單片機的檢測、報警、等數據,并把接收到的PC機控制命令傳送至TM模塊。另一部分是與PC機的通信,通過(guò)Socket的UDP協(xié)議進(jìn)行數據傳輸,兩者之間形成C/S結構模式。應用以太網(wǎng)通信(基于TCP/IP)的通信方式進(jìn)行數據傳輸共享,實(shí)現交互操作。系統通信流向如圖3所示。
CM模塊端與單片機和PC機兩方數據通信采用多進(jìn)程方式來(lái)實(shí)現,與單片機串口通信和PC機的套接口通信分別在CMTM和CMPC這兩個(gè)進(jìn)程中完成,兩進(jìn)程之間通過(guò)共享內存和信號量實(shí)現數據的共享及進(jìn)程間的同步。
2.1串口通信(CMTM進(jìn)程)
利用串口進(jìn)行文件傳輸首先要打開(kāi)和配置串口,按要求設置好速度和傳送方式之類(lèi)的參數;然后,選擇一定的傳送協(xié)議和方式,設置好傳送雙方的同步方式;接著(zhù)就可以按照選擇的傳送協(xié)議和同步方式來(lái)傳送數據或文件了。Linux平臺下串口屬性參數全部反映在一個(gè)structtermios結構體中,其結構如下:
structtermios{
tcflag_tc_iflag;//輸入模式標志
tcflag_tc_oflag;//輸出模式標志
tcflag_tc_cflag//控制模式標志
tcflag_tc_lflag;//線(xiàn)路選項
cc_tc_line;//行控制
cc_tc_cc[NCCS];//控制字符
};
其中含有大約50個(gè)標志位,這些標志位在頭文件termios.h中定義。串口編程的關(guān)鍵是對串口的配置,為了編程方便,Linux系統還包含了一系列針對termios結構的設置函數,用來(lái)完成獲取和設置串口屬性[2]。Linux下串口設置很多,本設計主要的設置有如下幾方面:
①c_cflag的基本參數設置,如波特率(Baudrate)、數據位(Bits)、停止位(Stops)及校驗方式(Parity)等。配置過(guò)程如下:
struettermiosoptions;//termios的變量聲明
optionsc_cflag|=B9600;//波特率為9600bps
optionsc_cflag|=CS8;//采用8個(gè)數據位
optionsc_cflag|=~CSTOPB;//使用1個(gè)停止位
optionsc_cflag=~PARENB;//取消校驗位
②輸入輸出方式設定。根據是否對傳輸的數據進(jìn)行預處理,可分為預處理方式(Canonical)和原始(Raw)方式。預處理方式常用于Modem通信。如果只是串口傳輸數據,而不需要串口來(lái)處理,則使用原始模式(RawMode)方式來(lái)通訊,本文采用原始輸入方式:
options.c_lflag=~(ICANON|ECHO|ECH-OE|ISIG);//RawModeforlnput
options.c_oflag=~OPOST;//RawModeforOutput
③控制字選項
c_cc包含一些控制字的定義和讀取等待定時(shí)器(ReadTimeoutTimer)配置選項。其中,VSTART和VSTOP參數設定軟件流控制的起始和停止字符(默認是11H和13H)。VMIN和VTIME參數用來(lái)控制系統的讀操作,VMIN設置每次讀取的最少字節數,VTIME設置讀取操作的等待時(shí)間(以0.1s為單位)。這2個(gè)參數的具體值影響了讀操作的行為。本文無(wú)軟件流的控制。所以設置如下:
Optionsc_cc[VTIME]=150;
Optionsc_cc[VMIN]=0;
除了上述的配置,傳送協(xié)議和方式的設定也是很關(guān)鍵的一環(huán)。結合實(shí)際情況,基于modbus協(xié)議的RTU傳輸模式作了相應的小變動(dòng)。由于變電站蓄電池數目較多,實(shí)現通信信息的識別,在發(fā)送包含自檢信息的字節前,先發(fā)送4個(gè)字節用于接收端的判斷,然后是幀長(cháng)度(1byte)、目標地址(1byte)、源地址(1byte)、命令字(1byte)、標志數據(2byte)、數據(n*3byte),最后是幀數據的CRC校驗值(2byte)。這里通訊數據采用不定長(cháng)幀格式,便于后序功能的擴展。串口配置、通訊協(xié)議和方式規定完成后,便可用read()和write()等函數進(jìn)行數據的接收和發(fā)送了。ARM與單片機串口數據交換實(shí)現在CMTM進(jìn)程中完成,其主流程圖如圖4(a)所示。進(jìn)程TMCM通過(guò)串口監聽(tīng)并接收單片機發(fā)送的檢測信號以及發(fā)送PC機的操作命令,負責將TM模塊發(fā)來(lái)的串口數據接收后存人相應的反饋數據共享內存SHM_TMCM中去,同時(shí)負責檢查共享內存SHM_CMTM中是否有新的控制或操作命令到來(lái),若有則將其轉發(fā)到串口。試運行時(shí)編寫(xiě)相關(guān)的串口軟件,手動(dòng)和自動(dòng)對CM模塊發(fā)送和接收數據,此進(jìn)程能準確實(shí)時(shí)地與軟件進(jìn)行數據交換,通信效果良好。
linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)
評論