• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      基于VC++6.0的讀表軟件設(shè)計(jì)

      2014-07-25 07:44:44文小玲鄒艷華
      關(guān)鍵詞:串口數(shù)據(jù)包指令

      易 馳,文小玲,鄒艷華,周 洵

      (武漢工程大學(xué) 電氣信息學(xué)院,湖北 武漢 430205)

      隨著城市化進(jìn)程的加快、物業(yè)管理智能化的推進(jìn)普及,城市的供水、供氣單位越來越多地投入使用新型智能遠(yuǎn)傳水表、氣表。目前,RS485、M-bus遠(yuǎn)傳表已經(jīng)在居民小區(qū)廣泛地投入運(yùn)用。但由于起步晚、技術(shù)不成熟等種種因素,安裝了自動(dòng)抄表系統(tǒng)的小區(qū),都或多或少會(huì)出現(xiàn)一些問題,如抄不到表讀數(shù)、表頭壞死等。同時(shí),新表的更替和使用也涉及到表地址的改寫,表頭密碼的設(shè)置等問題。因此,在抄表維護(hù)工作人員電腦上設(shè)計(jì)一種基于串口通信原理的直讀表軟件成為一種必然。這將極大地方便水、氣表表頭模塊的檢測(cè)和抄表系統(tǒng)的日常維護(hù)等工作。本文運(yùn)用VC++6.0設(shè)計(jì)一種能夠讀取表讀數(shù)和表地址、設(shè)置表地址和表密碼,并能測(cè)試串口通信情況的直讀表軟件。

      1 硬件系統(tǒng)組成原理

      硬件系統(tǒng)組成原理框圖如圖1所示,主要由表頭、RS232-RS485轉(zhuǎn)換器、PC機(jī)組成。RS232-RS485轉(zhuǎn)換器內(nèi)部包涵了485接口電路、光電隔離和232接口電路。通過該轉(zhuǎn)換器可以將485總線制設(shè)備(光電直讀表模塊)與計(jì)算機(jī)的串口相連,從而實(shí)現(xiàn)計(jì)算機(jī)與485總線制設(shè)備的通信。表頭模塊內(nèi)部除了包含單片機(jī)、光電隔離電路外,同時(shí)還集成了功能很強(qiáng)的可實(shí)現(xiàn)全雙工通信的485接口電路,可以同時(shí)接收和發(fā)送數(shù)據(jù),能夠方便地和遠(yuǎn)端上位機(jī)進(jìn)行通信。

      圖1 硬件系統(tǒng)組成示意圖

      硬件系統(tǒng)各組成部分之間的接線很方便,將485型表的4根線準(zhǔn)確地接在RS232-RS485轉(zhuǎn)換器對(duì)應(yīng)的485端口上,即A、B信號(hào)線和P、G電源線分別正確連接;同時(shí)232串口線一端連接轉(zhuǎn)換器,另一端連接電腦,轉(zhuǎn)換器電源口接上12 V直流電源,RS485轉(zhuǎn)換器可由P、G線給表頭單片機(jī)模塊上電,指令信號(hào)則由A、B信號(hào)線傳遞,因此在計(jì)算機(jī)中用直讀表通信軟件即可讀得表數(shù)據(jù)。

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

      讀表軟件的主要功能是通過對(duì)軟件界面窗口按鈕的操作,設(shè)置串口通信參數(shù)、查詢表的通信情況和表的數(shù)據(jù)信息等,包括上位機(jī)與表之間發(fā)送、接收指令的顯示;查詢表的類型,實(shí)時(shí)讀取表的數(shù)據(jù)、密碼、地址編碼;修改表的地址編碼、密碼和開關(guān)閥門狀態(tài)。

      本軟件依據(jù)硬件設(shè)備廠家配套的通信協(xié)議進(jìn)行相應(yīng)開發(fā),此數(shù)據(jù)通信協(xié)議適用于RS485型/Mbus型直讀水表、RS485型氣表、RS485型電表和總線制光電直讀直飲水表,采用異步串行方式(一位起始位/八位數(shù)據(jù)位/兩位停止位/無奇偶校驗(yàn)/波特率 2 400),采用 CRCCCITT(循環(huán)冗余碼)檢驗(yàn)技術(shù),保證通信數(shù)據(jù)準(zhǔn)確、可靠。通信用數(shù)據(jù)包以“數(shù)據(jù)包頭”開頭,“數(shù)據(jù)包尾”結(jié)尾。從上位機(jī)到表的發(fā)送指令以及從表到上位機(jī)的返回指令格式如表1、表2所示。其中,CRC校驗(yàn)碼為有效數(shù)據(jù)的校驗(yàn)碼。CRC校驗(yàn)數(shù)據(jù)長度為2 B,CRC—CCITT是一個(gè)17位生成多項(xiàng)式 G=[1 0001 0000 0010 0001],用多項(xiàng)式形式表示為 G(x)=x16+x12+x5+1,由它產(chǎn)生的檢驗(yàn)碼R的二進(jìn)制位數(shù)是 16 bit(2 B)。

      表1 發(fā)送數(shù)據(jù)包幀格式

      表2 返回?cái)?shù)據(jù)包幀格式

      軟件采用Microsoft Communications Control(以下簡稱MSComm)控件實(shí)現(xiàn)表模塊單元與上位PC機(jī)間的串口數(shù)據(jù)通信。MSComm是Microsoft公司提供的簡化Windows下串行通信編程的ActiveX控件,它為應(yīng)用程序提供了通過串行接口收發(fā)數(shù)據(jù)的簡便方法[1]。MSComm提供了一系列標(biāo)準(zhǔn)通信命令的使用接口,利用它可以建立與串口的連接,并可以通過串口連接到其他通信設(shè)備、發(fā)出命令、交換數(shù)據(jù)以及監(jiān)視和響應(yīng)串行連接中發(fā)生的事件和錯(cuò)誤。而且,MSComm控件在 VC++、VB、Delphi等語言中均可使用,利用MSComm控件編寫串口通信程序時(shí),程序員不必花時(shí)間去了解較為復(fù)雜的API函數(shù)。

      本軟件的設(shè)計(jì)流程如圖2所示。

      圖2 程序設(shè)計(jì)流程圖

      根據(jù)流程圖,具體設(shè)計(jì)步驟如下:

      (1)建立項(xiàng)目,打開 VC++6.0,建立一個(gè)基于對(duì)話框的MFC應(yīng)用程序COMTOOL,在項(xiàng)目中插入MSComm控件,對(duì)于軟件界面的設(shè)計(jì),在VC下運(yùn)用dialog對(duì)話框,可以拖拽控件,對(duì)控件布局,極為方便[2];

      (2)在對(duì)話框中添加發(fā)送和接收數(shù)據(jù)框。向主對(duì)話框中添加兩個(gè)編輯框,一個(gè)用于顯示接收數(shù)據(jù)包,ID為IDC_ReceiveEdit;另一個(gè)用于輸入發(fā)送數(shù)據(jù),ID為IDC_SendEdit;再添加一個(gè)按鈕,功能是按一次就把發(fā)送編輯框中的內(nèi)容發(fā)送一次,將其ID設(shè)為IDC_Send。再打開 ClassWizard->Member Viariables選項(xiàng)卡, 選擇CSCommTestDlg類,為IDC_ReceiveEdit添加CString變量m_strReceive, 為 IDC_SendEdit添 加 CString變 量m_strSend。說明:m_strReceive和m_strSend分別用來放入接收和發(fā)送的字符數(shù)據(jù)。

      (3)設(shè)置串口參數(shù)和打開串口。串口參數(shù)設(shè)置區(qū)的設(shè)計(jì)是關(guān)鍵環(huán)節(jié),在操作軟件時(shí),只有正確的設(shè)置好串口的配置參數(shù),才能保證串行口的正常通信。同時(shí)需要設(shè)計(jì)一個(gè)按鈕來打開串口,在界面做一個(gè)“打開串口”按鈕,點(diǎn)擊此按鈕打開串口時(shí),同時(shí)會(huì)顯示串口參數(shù)的配置信息。

      串口參數(shù)設(shè)置區(qū)的設(shè)計(jì)主要是向主對(duì)話框界面中添加以上參數(shù)相應(yīng)的編輯框,并將編輯框命名相應(yīng)的參數(shù),把串口選擇、波特率、數(shù)據(jù)位、停止位和校驗(yàn)位等編輯框拖拽在一個(gè)顯示框內(nèi),命名為“串口設(shè)置”,這樣方便串口參數(shù)的設(shè)置和顯示,“串口設(shè)置”區(qū)的界面設(shè)計(jì)包括:串口選擇、波特率、數(shù)據(jù)位、停止位和校驗(yàn)位的設(shè)置。向主對(duì)話框界面中添加以上參數(shù)相應(yīng)的編輯框,在工程COMTOOL的主程序文件中對(duì)串口選擇、波特率、數(shù)據(jù)位、停止位和校驗(yàn)位進(jìn)行初值定義,程序如下:

      在指令發(fā)送、接收編輯框和串口參數(shù)配置設(shè)計(jì)完成后,在軟件界面上設(shè)計(jì)一個(gè)用來決定串口通信開和關(guān)的按鈕,即 Push Button控制鍵,將其命名為“打開串口/關(guān)閉串口”按鈕。在該按鈕的處理函數(shù)中打開串口,即在相應(yīng)的處理函數(shù)OnOpenClose()中添代碼即可實(shí)現(xiàn)按鈕功能。

      (4)構(gòu)造發(fā)送指令。在串行通信的情況下,由于表的基本數(shù)據(jù)信息會(huì)以數(shù)據(jù)包的形式傳送,為了上位機(jī)能獲取表的數(shù)據(jù)信息,因此在程序設(shè)計(jì)起初階段必須構(gòu)造相應(yīng)的發(fā)送指令,使表頭模塊返回對(duì)應(yīng)的數(shù)據(jù)信息包(即返回指令)。先為發(fā)送按鈕添加一個(gè)單擊消息即BN_CLICKED處理函數(shù),打開 ClassWizard->Message Maps,選擇類CSCommTestDlg,選擇IDC_BUTTON_MANUALSEND, 雙 擊BN_CLICKED添加 OnSend()函數(shù),并在函數(shù)中添加發(fā)送數(shù)據(jù)功能代碼,現(xiàn)在可以連接設(shè)備測(cè)試軟件是否能發(fā)送和接收指令,配置好串口參數(shù),點(diǎn)擊發(fā)送按鈕,如數(shù)據(jù)通信成功,進(jìn)行下一步[3]。

      不同的功能按鈕對(duì)應(yīng)不同的發(fā)送指令,將每個(gè)按鈕賦予一個(gè)變量參數(shù),當(dāng)按鈕操作一次,設(shè)定的發(fā)送指令字符串便賦給變量參數(shù),同時(shí)發(fā)送指令數(shù)據(jù)包就發(fā)送出去,因此才能完成軟件的讀取表讀數(shù)、改寫表地址等不同功能。例如“手動(dòng)讀表”按鈕的功能代碼如下:

      為了實(shí)現(xiàn)對(duì)表不同的數(shù)據(jù)信息的讀取,即為了發(fā)送不同的指令從而獲取相應(yīng)不同的返回?cái)?shù)據(jù)包,軟件界面上會(huì)設(shè)計(jì)不同的功能按鈕,如 “手工讀表”、“地址設(shè)置”、“密碼設(shè)置”等,每個(gè)功能按鈕會(huì)有不同的發(fā)送指令,這樣就能實(shí)現(xiàn)不同的功能。每個(gè)按鈕的處理函數(shù)中會(huì)設(shè)計(jì)相應(yīng)的發(fā)送指令。例如:m_strSend=_T("FE FE FE 42 42 42 42 53 FF FF FF FF 52 2D 3E 45")這條廣播讀表指令以字符串形式賦值給“手動(dòng)讀表”按鈕的變量參數(shù)m_strSend,這樣每當(dāng)操作“手動(dòng)讀表”或其他按鈕,就會(huì)發(fā)送一條指令。

      (5)CRC校驗(yàn)。點(diǎn)擊發(fā)送指令按鈕,每發(fā)送一條指令,正常情況下表模塊會(huì)返回一條指令。在主體程序的設(shè)計(jì)中,這里添加一個(gè)接收返回?cái)?shù)據(jù)包的功能區(qū),將返回的指令數(shù)據(jù)包暫時(shí)存儲(chǔ),以便對(duì)其進(jìn)行CRC校驗(yàn),判斷返回的數(shù)據(jù)包是否是有效數(shù)據(jù)。CRC校驗(yàn)環(huán)節(jié)是為了測(cè)試返回?cái)?shù)據(jù)包是否是所需要的有效返回指令,即是否是發(fā)送指令對(duì)應(yīng)的返回指令,實(shí)現(xiàn)CRC校驗(yàn)環(huán)節(jié)的主要程序段如下:

      (6)解析數(shù)據(jù)包程序。在 CRC校驗(yàn)無誤后,才對(duì)返回的數(shù)據(jù)包進(jìn)行解析,故實(shí)現(xiàn)解析功能的程序設(shè)計(jì)是本設(shè)計(jì)的重要一環(huán),解析的目的是將返回?cái)?shù)據(jù)包中的有效數(shù)據(jù)段轉(zhuǎn)換成表的相應(yīng)信息,并正確地顯示在軟件界面上。如實(shí)現(xiàn)地址改寫的主要解析程序如下所示:

      (7)添加表數(shù)據(jù)顯示框和設(shè)置按鈕。為了清楚反映表的數(shù)據(jù)信息,故設(shè)在軟件界面上添加不同的數(shù)據(jù)顯示框,也是設(shè)計(jì)的一部分?;就ㄐ懦晒螅驮趯?duì)話框中添加發(fā)送和接收數(shù)據(jù)框類似,添加表的數(shù)據(jù)顯示框,并對(duì)每個(gè)顯示框設(shè)置函數(shù)變量,變量的值就是表的數(shù)據(jù);添加表的設(shè)置按鈕,如“地址設(shè)置”等按鈕,并添加相應(yīng)的處理函數(shù),在處理函數(shù)中編寫代碼就能實(shí)現(xiàn)按鈕的相應(yīng)功能。

      (8)解析重置和清空緩存。程序設(shè)計(jì)中,“解析重置,緩存清空”這一環(huán)節(jié)的設(shè)計(jì)是為了在一次通信結(jié)束,表的數(shù)據(jù)正確顯示后,將緩存數(shù)據(jù)包的功能區(qū)清空,以便下一次通信返回?cái)?shù)據(jù)包的緩存,從而使軟件能夠多次、反復(fù)地對(duì)表模塊發(fā)送相同或不同指令,快捷地完成“讀表”、“修改地址”等各種功能。這里在“解析重置”的設(shè)計(jì)中參數(shù)rec_w起到關(guān)鍵作用。例如,在“手動(dòng)讀表”中rec_w=1,同時(shí)對(duì)應(yīng)這條發(fā)送指令的解析代碼中也將rec_w=1,故不同的發(fā)送指令會(huì)有不同的解析函數(shù)段,這樣,完成一次讀表操作后需要將rec_w的值重置為0,以便下次rec_w重新賦值進(jìn)行不同的操作。而對(duì)于“緩存清空”的代碼設(shè)計(jì)如下所示:

      如程序設(shè)計(jì)流程圖所示,基于這種設(shè)計(jì)思想,實(shí)際操作時(shí)軟件的工作流程如下:程序配置好通信串口參數(shù)后,一直處于等待OnComm事件狀態(tài)。上位機(jī)需要讀取表的數(shù)據(jù)時(shí),通過讀表軟件發(fā)送一條讀表指令數(shù)據(jù)包,當(dāng)接收到表模塊返回的數(shù)據(jù)包后放入程序中的緩存功能函數(shù)中,再經(jīng)過CRC校驗(yàn)返回?cái)?shù)據(jù)包是否正確,校驗(yàn)成功后才調(diào)用解析子函數(shù)[4],對(duì)接收指令數(shù)據(jù)包進(jìn)行解析,然后將解析出的表的參數(shù)完整顯示在讀表軟件界面上,最后將解析函數(shù)重置并將緩存功能函數(shù)中數(shù)據(jù)清空,結(jié)束本次數(shù)據(jù)通信。

      3 測(cè)試結(jié)果分析

      經(jīng)過調(diào)試運(yùn)行成功后,設(shè)計(jì)好的界面如圖3所示。

      從圖3中可以看到,使用該軟件調(diào)試串口通信、讀取表數(shù)據(jù)非常方便、直觀。當(dāng)連接好表等相關(guān)設(shè)備時(shí),用戶根據(jù)實(shí)際情況選擇相應(yīng)的串行端口,設(shè)定所需的波特率(在此選用2 400),再設(shè)置奇偶校驗(yàn)位、數(shù)據(jù)位、停止位;點(diǎn)擊“串口打開”按鈕串口便打開,再點(diǎn)擊“手工讀表”便可以進(jìn)行指令的傳送和接收,并能正確顯示表的讀數(shù)、地址等相關(guān)信息;當(dāng)在表與上位機(jī)通信正常情況下,點(diǎn)擊“地址設(shè)置”按鈕便可以將表的地址更改;“密碼設(shè)置”等按鈕的操作與“地址設(shè)置”類似,并且實(shí)現(xiàn)其相應(yīng)的功能。同時(shí),可以通過“清空顯示”按鈕清除接收數(shù)據(jù)在接收文本框中的顯示。

      圖3 完善后的軟件界面

      本軟件經(jīng)過測(cè)試后可以進(jìn)行上位機(jī)與表之間數(shù)據(jù)包的發(fā)送與接收,并能正確解析出返回指令中表的實(shí)時(shí)數(shù)據(jù),如表的讀數(shù),表的地址等表的信息清楚地顯示在軟件界面上;同時(shí),表地址的重新設(shè)置,表密碼的修改等功能均能實(shí)現(xiàn)。軟件適用于常見的RS485型/Mbus型水表、RS485型氣表和RS485型電表,對(duì)遠(yuǎn)傳抄表系統(tǒng)的維護(hù)和安裝工作有一定的現(xiàn)實(shí)意義。

      [1]封亞斌.采用串口通信技術(shù)實(shí)現(xiàn) Modbus數(shù)據(jù)通信[J].自動(dòng)化儀表,2004,25(10):56-58.

      [2]張新村,嚴(yán)殊.基于ARM的 Linux系統(tǒng)下 Qt串口助手的設(shè)計(jì)[J].軟件導(dǎo)刊,2011,(8):64-66.

      [3]龔建偉,熊光明.Visual C++/Turbo C串口通信編程實(shí)踐[M].北京:電子工業(yè)出版社,2007.

      [4]宋國清,劉暢.基于 BTF340開發(fā)板的 Modbus從機(jī)協(xié)議實(shí)現(xiàn)[J].雞西大學(xué)學(xué)報(bào),2011,11(1):44-45.

      猜你喜歡
      串口數(shù)據(jù)包指令
      聽我指令:大催眠術(shù)
      淺談AB PLC串口跟RFID傳感器的通訊應(yīng)用
      ARINC661顯控指令快速驗(yàn)證方法
      LED照明產(chǎn)品歐盟ErP指令要求解讀
      SmartSniff
      USB接口的多串口數(shù)據(jù)并行接收方法探索
      基于藍(lán)牙串口適配器的GPS接收機(jī)與AutoCAD的實(shí)時(shí)無線通信
      基于Libpcap的網(wǎng)絡(luò)數(shù)據(jù)包捕獲器的設(shè)計(jì)與實(shí)現(xiàn)
      基于并行控制的FPGA多串口拓展實(shí)現(xiàn)
      坐標(biāo)系旋轉(zhuǎn)指令數(shù)控編程應(yīng)用
      平阴县| 安丘市| 柏乡县| 富阳市| 北碚区| 荣成市| 临安市| 永济市| 霍林郭勒市| 湛江市| 田林县| 翁源县| 利川市| 灵宝市| 新安县| 桐庐县| 华池县| 迭部县| 平山县| 康乐县| 固阳县| 阿克陶县| 永修县| 唐海县| 山阳县| 信宜市| 延寿县| 江孜县| 齐河县| 抚远县| 葵青区| 蒙自县| 泗阳县| 庄浪县| 沾益县| 南平市| 凤冈县| 唐海县| 西青区| 龙门县| 宝坻区|