專利名稱:采用串口通信對(duì)通信特服終端設(shè)備進(jìn)行監(jiān)控的實(shí)現(xiàn)方法
技術(shù)領(lǐng)域:
本發(fā)明屬于通信技術(shù)領(lǐng)域,特別涉及對(duì)通信特服終端設(shè)備的監(jiān)控,即根據(jù)接收信息對(duì)線路和工作坐席臺(tái)當(dāng)前工作狀態(tài)進(jìn)行直觀顯示,根據(jù)發(fā)送信息進(jìn)行線路開(kāi)放、調(diào)度、閉鎖,坐席開(kāi)放、調(diào)度、閉鎖等一系列控制管理工作。
背景技術(shù):
通信數(shù)據(jù)在傳輸過(guò)程中,需要對(duì)通信特服終端設(shè)備的工作狀態(tài)進(jìn)行實(shí)時(shí)的監(jiān)測(cè),以便發(fā)現(xiàn)故障及時(shí)反饋、及時(shí)修理。在溝通通信設(shè)備和監(jiān)控機(jī)時(shí)常用的數(shù)據(jù)交換方式有許多,如無(wú)線通信技術(shù)、基于網(wǎng)絡(luò)的數(shù)據(jù)傳輸技術(shù)、和串口通信技術(shù)等。采用串口通信技術(shù),具有成本低、保密性強(qiáng)、安全穩(wěn)定等優(yōu)點(diǎn),因此本發(fā)明在監(jiān)控通信特服終端設(shè)備時(shí)采用串口通信技術(shù)。即采用監(jiān)控計(jì)算機(jī)與通信特服終端之間進(jìn)行串口通信,實(shí)時(shí)地從通信終端設(shè)備中傳出狀態(tài)信息,監(jiān)控機(jī)接收數(shù)據(jù)并實(shí)時(shí)顯示狀態(tài);在監(jiān)控機(jī)端可以人為發(fā)出指令,進(jìn)行線路或坐席的調(diào)度、控制等管理工作。目前,實(shí)現(xiàn)串口通信的方法很多,比如①用ACTIVEX控件實(shí)現(xiàn)串口通信②利用 WINDOWS提供的標(biāo)準(zhǔn)通信API函數(shù)實(shí)現(xiàn)串口通信。本發(fā)明采用WINDOWS提供的標(biāo)準(zhǔn)通信API 函數(shù)實(shí)現(xiàn)串口通信。在實(shí)時(shí)顯示部分的程序設(shè)計(jì)中,可采用的編程語(yǔ)言也非常多,常用的有VC++、VB、 B0RLANDCC++、C#等,本發(fā)明采用BORLANDC C++BUILEDR語(yǔ)言編程實(shí)現(xiàn)監(jiān)控機(jī)實(shí)時(shí)顯示與交互。在串口通信數(shù)據(jù)的讀寫控制方面,可采用WINDOWS定時(shí)器進(jìn)行數(shù)據(jù)讀寫控制,也可采用多線程通信中使用的監(jiān)控串口事件的方式對(duì)串口通信進(jìn)行控制,考慮到通信監(jiān)控的穩(wěn)定性、時(shí)性、專業(yè)性等因素,本發(fā)明采用定時(shí)器方式進(jìn)行串口通信控制。發(fā)明內(nèi)容本發(fā)明提出了采用BORLANDC C++BUILDER編程進(jìn)行監(jiān)測(cè)機(jī)后臺(tái)管理, 配合WINDOWS提供的標(biāo)準(zhǔn)通信API函數(shù)實(shí)現(xiàn)串口通信,采用定時(shí)器進(jìn)行串口通信控制的實(shí)現(xiàn)方法。具體技術(shù)方案如下1)設(shè)計(jì)串口通信硬件電路。2)設(shè)計(jì)串口通信程序?qū)崿F(xiàn)串口通信;3)設(shè)計(jì)定時(shí)器,實(shí)現(xiàn)串口控制;4)設(shè)計(jì)實(shí)時(shí)更新顯示及控制管理程序。所述步驟1)中,通信終端設(shè)備端采用8051系列單片機(jī),監(jiān)測(cè)機(jī)端采用80X86系列主機(jī),選擇RS232進(jìn)行串口通信,選擇MAX238作為接口芯片,其結(jié)構(gòu)示意圖如圖1所示。串口通信過(guò)程中通信特服終端設(shè)備所傳出的數(shù)據(jù)主要有①線路狀態(tài)信息②坐席狀態(tài)信息③ 經(jīng)通信終端設(shè)備統(tǒng)計(jì)后的工作量數(shù)據(jù)。監(jiān)測(cè)機(jī)發(fā)出的數(shù)據(jù)主要有①線路控制信息②坐席控制信息所述步驟幻中,串口通信程序設(shè)計(jì)主要包含如下內(nèi)容1、打開(kāi)串口所使用函數(shù)CreateFile該函數(shù)的原型為HANDLECreateFile (LPCTSTR IpFiIeName,//IpFileName 將要打開(kāi)的串口邏輯名,如 "C0M1,,;
DWORD dwDesiredAccess,//dwDesiredAccess :指定串口訪問(wèn)的類型,可以
是讀取、寫//入或二者并列;DWORD dwShareMode,//dwShareMode 指定共享屬性,由于串口不能共
享,該參數(shù)//必須置為0;LPSECURITY_ATTRIBUTES IpSecurityAttributes, //IpSecurityAttributes 引用安全性屬性//結(jié)構(gòu),缺省值為NULL ;DWORD dwCreationDistribution, //dwCreationDistribution 倉(cāng)ll建標(biāo)志,對(duì)串
口操作該參數(shù)// 必須置為 0PEN_EXISTING ;DWORD dwFlagsAndAttributes, //dwFlagsAndAttributes 屬性描述,用于指定該串口是Il否進(jìn)行異步操作,該值為FILE_FLAG_ OVERLAPPEDH表示使用異步的1/0 ;該值為0,表示同步 1/0操作;HANDLEhiTemplateFile)//MemplateFile 對(duì)串口而言該參數(shù)必須置為NULL ;2、配置串口所使用函數(shù)BuildCommDCB在打開(kāi)通訊設(shè)備句柄后,常常需要對(duì)串口進(jìn)行一些初始化配置工作。這需要通過(guò)一個(gè)DCB結(jié)構(gòu)來(lái)進(jìn)行。DCB結(jié)構(gòu)包含了諸如波特率、數(shù)據(jù)位數(shù)、奇偶校驗(yàn)和停止位數(shù)等信息。 在查詢或配置串口的屬性時(shí),都要用DCB結(jié)構(gòu)來(lái)作為緩沖區(qū)。DCB主要有以下幾個(gè)重要的成員①BYTE ByteSize //通信字節(jié)位數(shù)②BYTEParity//指定奇偶校驗(yàn)方法。此成員可以有下列值// EVENPARITY偶校驗(yàn)N0PARITY無(wú)校驗(yàn)//MARKPARITY標(biāo)記校驗(yàn)0DDPARITY奇校驗(yàn)③BYTEMopBits//指定停止位的位數(shù)。此成員可以有下列值//0NEST0PBITl位停止位//TW0ST0PBITS2位停止位//0NE5ST0PBITS1. 5位停止位除了使用B⑶設(shè)置串口的一些基本參數(shù)外,一般還需要設(shè)置串口收發(fā)數(shù)據(jù)緩沖區(qū)的大小和超時(shí),超時(shí)的作用是在指定的時(shí)間內(nèi)沒(méi)有讀入或發(fā)送指定數(shù)量的字符,讀寫操作仍然會(huì)結(jié)束。Windows用1/0緩沖區(qū)來(lái)暫存串口輸入和輸出的數(shù)據(jù),如果通信的速率較高, 則應(yīng)該設(shè)置較大的緩沖區(qū)。我們可以使用API函數(shù)ktupComm設(shè)置串口的輸入和輸出緩沖區(qū)的大小,其原型如下B00L SetupComm(HANDLE hFile, //串口句柄DWORD dwInQueue, //輸入緩沖區(qū)的大小(字節(jié)數(shù))DWORD dwOutQueue) //輸出緩沖區(qū)的大小(字節(jié)數(shù))串口初始化的過(guò)程為
DCB deb ;//定義數(shù)據(jù)控制塊結(jié)構(gòu)GetCommState (hCom, &dcb) ;// 讀串口原來(lái)的參數(shù)設(shè)置BuildCommDCB ( "COM2 :9600, N,8,1”,&dcb) ;// 創(chuàng)建數(shù)據(jù)控制塊 DCB 結(jié)構(gòu)SetCommState (hCom, &dcb) ;// 將結(jié)構(gòu) DCB 的主要參數(shù)設(shè)置到串口 COM2說(shuō)明其中的BuildCommDCB( "COM2 :9600,N,8,1”,&dcb)語(yǔ)句可以代替前面 4 條串口通信參數(shù)賦值語(yǔ)句的效果。3、設(shè)置通信口狀態(tài)所使用函數(shù)ktComn^tate函數(shù)原型B00L SetCommState (HANDLE hFile,//通信設(shè)備句柄LPDCB IpDCB//指針指向DCB結(jié)構(gòu)塊);要修改串行口的配置,應(yīng)該先修改DCB結(jié)構(gòu),然后再調(diào)用ktCommS tate函數(shù)用指定的DCB結(jié)構(gòu)來(lái)設(shè)置串行口。4、清除通信接收或發(fā)送緩沖區(qū)所使用函數(shù)PurgeComm在讀寫串口之前,還要用PurgeCommC ..)函數(shù)清空緩沖區(qū),該函數(shù)原型BOOLPurgeComm(HANDLEhFile,//串口句柄DWORD dwFlags)//需要完成的操作參數(shù)dwFlags指定要完成的操作, 可以是下列值的組合PURGE_TXAB0RT中斷所有寫操作并立即返回, 即使寫操作還沒(méi)有完成;PURGE_RXAB0RT中斷所有讀操作并立即返回,即使讀操作還沒(méi)有完成;PURGE_T)(CLEAR清除輸出緩沖區(qū)PURGE_RXCLEAR清除輸入緩沖區(qū)5、恢復(fù)或取得通信口狀態(tài)所使用函數(shù)ClearCommError函數(shù)原型B00L ClearCommErroHHANDLE hFile,//通信設(shè)備句柄LPDffORD IpErrors,//指針指向接收錯(cuò)誤代碼LPC0MSTAT IpStat//指針指向通信狀態(tài)數(shù)據(jù)緩存區(qū));說(shuō)明在調(diào)用ReadFile和feiteFile之前,線程應(yīng)該調(diào)用ClearCommError函數(shù)清除錯(cuò)誤標(biāo)志。該函數(shù)負(fù)責(zé)報(bào)告指定的錯(cuò)誤和設(shè)備的當(dāng)前狀態(tài)。6、從通信接收緩沖區(qū)讀字符所使用函數(shù)ReadFile函數(shù)原型B00L ReadFile (HANDLE hFile,//串口的句柄LPVOID IpBuffer,//保存讀入數(shù)據(jù)的指針DWORD nNumberOfBytesToRead,//要讀入的數(shù)據(jù)的字節(jié)數(shù)
LPDffORD IpNumberOfBytesRead, // 實(shí)際讀入的字節(jié)數(shù)LPOVERLAPPED IpOverlapped)//OVERLAPPED,同步為 NULL7、向通信發(fā)送緩沖區(qū)寫字符所使用函數(shù)WriteFile函數(shù)原型BOOL WriteFile (HANDLE hFile,//串口的句柄LPCVOIDlpBuffer,//要寫入數(shù)據(jù)的地址DWORD nNumberOfBytesToffrite, //要寫入數(shù)據(jù)的字節(jié)數(shù)LPDffORD IpNumberOfBytesffritten, // 實(shí)際寫入的字節(jié)數(shù)LPOVERLAPPEDlpOverlapped)//OVERLAPPED,同步為 NULL。說(shuō)明在進(jìn)行同步操作時(shí),讀寫函數(shù)要等到執(zhí)行完才返回,而在異步操作時(shí)函數(shù)立即返回,但不保證讀寫操作完成,這時(shí)候就需要使用OVERLAPPED結(jié)構(gòu)進(jìn)行異步控制,該結(jié)構(gòu)體有一個(gè)重要的成員hEvent,該成員是windows事件對(duì)象的句柄在控制線程同步及異步操作時(shí)常用到,如果是異步操作,我們可以使用CreateEvent (...)創(chuàng)建事件對(duì)象并將返回值賦給hEvent,然后使用WaitForSingleObject或GetOverlappedResult等待讀寫操作完成,進(jìn)而達(dá)到控制異步操作的目的。8、關(guān)閉通信串口所使用函數(shù)CloseHandle在不使用串口的時(shí)候應(yīng)該將其關(guān)閉,以釋放windows的資源供其他程序使用,關(guān)閉串口只需調(diào)用CloseHandle (hComm/*串口句柄*/)即可。所述步驟3)中,采用設(shè)置定時(shí)器的方法實(shí)現(xiàn)串口通信的讀寫控制。①設(shè)置定時(shí)器1控制線路狀態(tài)信息的接收②設(shè)置定時(shí)器2控制數(shù)據(jù)的發(fā)送③設(shè)置定時(shí)器3控制坐席狀態(tài)信息的接收。④退出時(shí)刪除定時(shí)器1、定時(shí)器2、定時(shí)器3所述步驟4)中,采用B0RLANDC C++BUILDER編程實(shí)現(xiàn)如下功能1\PCM狀態(tài)信息的實(shí)時(shí)顯示對(duì)2M 口送來(lái)的30路線路信息狀態(tài)進(jìn)行監(jiān)測(cè),采用不同顏色位圖實(shí)時(shí)反映它是處于空閑狀態(tài),還是應(yīng)答狀態(tài)或鎖閉態(tài),并可對(duì)每路的呼入次數(shù)等進(jìn)行統(tǒng)計(jì)。2、模擬線路和座席狀態(tài)監(jiān)測(cè)實(shí)時(shí)地對(duì)系統(tǒng)所具有的多條線路狀態(tài)(示閑、占用、應(yīng)答、閉塞)進(jìn)行檢測(cè),對(duì)系統(tǒng)所帶的多個(gè)座席狀態(tài)(示閑、占用、應(yīng)答、閉塞)進(jìn)行監(jiān)測(cè),在多條線路占用多個(gè)座席的情況下,可實(shí)時(shí)反映哪具體某條線路占用了哪個(gè)工作座席臺(tái),為維護(hù)人員提供方便。3、閉塞設(shè)置功能通過(guò)前臺(tái)機(jī),可通過(guò)設(shè)置,人為地閉塞某些線路或閉塞某些座席,為故障查找提供有效手段,也可將不用的線路、座席暫時(shí)閉塞不用,待擴(kuò)容要用時(shí),再開(kāi)放它。4、信息字監(jiān)測(cè)對(duì)2M 口數(shù)字線路的幀同步碼,復(fù)幀同步碼字進(jìn)行顯示,便于直觀地發(fā)現(xiàn)是同步還是失步。5、設(shè)備設(shè)置功能—個(gè)通信特服終端設(shè)備滿配置時(shí),是多塊2M數(shù)字板一塊,用戶線路板多塊(每路上包括兩路用戶線路)。設(shè)備配置功能可將插了哪些板子,板上哪條線路正使用,哪條沒(méi)用, 通過(guò)清晰的位圖進(jìn)行顯示,一目了然。6、主叫號(hào)碼顯示此功能是針對(duì)數(shù)字2M 口 30條線路的,在使用多頻互控收主叫號(hào)碼的情況下,此功能可以將所收的主叫號(hào)碼完整地顯示在對(duì)應(yīng)的線路號(hào)上。7、信令顯示此功能也是針對(duì)2M 口數(shù)字電路的,它能夠?qū)⒛硹l線路的信令處于空閑、占用或占用證實(shí)、話務(wù)員拆線狀態(tài)信息實(shí)時(shí)地顯示出來(lái),便于維護(hù)人員監(jiān)測(cè)線路狀態(tài)。8、分組功能此功能分三部分a、30路PCM分組,可將線路隨意地分成A、B兩組b、8路用戶線分組,可將8路隨意地分成A、B兩組c、8座席分組,可將8路隨意地分成A、B兩組此功能是為實(shí)現(xiàn)一通信特服終端設(shè)備接多種工作坐席而專門設(shè)計(jì)的。即可以將通信特服終端設(shè)備同時(shí)接114或1 等其它特服,可實(shí)現(xiàn)線路座席分組使用,不會(huì)交叉分配。9、告警功能可以監(jiān)測(cè)PCM同步信號(hào),座席全鎖信號(hào)和其它各種故障信號(hào),在它們不能正常工作時(shí)給出告警圖象并按有蜂鳴聲,故障恢復(fù),告警圖象消失同時(shí)關(guān)閉蜂鳴聲音。10、測(cè)試串行口以上所有功能都是以串行口正常通信為基礎(chǔ)的,因此串行口能否正常工作是整個(gè)監(jiān)測(cè)功能否得以實(shí)現(xiàn)的關(guān)鍵。因此特意設(shè)計(jì)了測(cè)試串行口的功能,對(duì)串行口是否有數(shù)據(jù)傳輸進(jìn)行檢測(cè),有則實(shí)時(shí)顯示抓捕的數(shù)據(jù)。
圖1—串口通信硬件實(shí)現(xiàn)2——串口通信部分程序流程3——8251讀寫操作功能4——監(jiān)控程序總流程圖具體實(shí)施方式
以下從設(shè)計(jì)串口通信硬件電路、設(shè)計(jì)定時(shí)器實(shí)現(xiàn)串口控制、設(shè)計(jì)串口通信程序?qū)崿F(xiàn)串口通信,、設(shè)計(jì)監(jiān)控顯示及管理程序四個(gè)方面分別介紹具體實(shí)施方式
。1、串口通信硬件電路及數(shù)據(jù)傳送協(xié)議設(shè)計(jì)串口通信硬件電路的設(shè)計(jì)如圖1所示。本電路采用串行接口電路8251設(shè)計(jì),采用 RS232串行口與監(jiān)控機(jī)之間通信,向監(jiān)控機(jī)傳送系統(tǒng)各種可視、可聞信號(hào)。監(jiān)控機(jī)能明確直觀地顯示整個(gè)系統(tǒng)的工作狀態(tài),便于工作人員的診斷、維護(hù)。8251是一種全雙工同步/異步/接收/發(fā)送器,可作為各種微處理器和單片機(jī)的串行接口電路。其中包括接收器、發(fā)生器、調(diào)制解調(diào)器控制電路、讀/寫控制電路、狀態(tài)緩沖器、發(fā)送命令/數(shù)據(jù)緩沖器和接收緩沖其工作原理如下①接收數(shù)據(jù)
串行傳送時(shí),數(shù)據(jù)接收器接收在R)(D引腳上串行輸入的數(shù)據(jù),并把它轉(zhuǎn)換為并行數(shù)據(jù),送入接收緩沖器。本電路工作于異步工作方式,在允許接收和接收準(zhǔn)備好時(shí),監(jiān)視RXD 輸入端。在無(wú)字符傳送時(shí),R )端為高電平。當(dāng)R )端出現(xiàn)低電平時(shí),啟動(dòng)內(nèi)部計(jì)數(shù)器計(jì)數(shù), 在計(jì)數(shù)到個(gè)字符寬度的1倍時(shí)重新采樣R)(D端。若R )仍為低電平,則確認(rèn)起始位。此后每隔16個(gè)脈沖采樣一次R)(D端,作為數(shù)據(jù)輸入,送入移位寄存器。經(jīng)移位,奇偶校驗(yàn)和去掉停止位后,并行送入接收數(shù)據(jù)緩沖器,同時(shí)發(fā)RXRDY信號(hào),向CPU表示數(shù)據(jù)已經(jīng)接收好。②發(fā)送數(shù)據(jù)串口傳輸時(shí),數(shù)據(jù)由發(fā)送器發(fā)出。發(fā)送器接收CPU送來(lái)的并行數(shù)據(jù),加上起始位、 奇偶校驗(yàn)位和停止位后,由T)(D輸出端串行發(fā)出。③讀寫控制電路用來(lái)對(duì)CPU輸出的控制信號(hào)進(jìn)行譯碼,以實(shí)現(xiàn)如圖3所示的讀寫功能,USART檢測(cè)/RD和/WR端的信號(hào)來(lái)確定何種I/O操作。若二者均為高電平,USART不執(zhí)行任何I/O操作;若二者均為低電平,按非法狀態(tài)處理;若/RD為低而/WR為高,CPU從 USART讀數(shù)據(jù),反之CPU向USART寫數(shù)據(jù)。監(jiān)控機(jī)與通信特服終端之間傳送數(shù)據(jù)時(shí),為便于區(qū)分,采用功能碼進(jìn)行約定。它所設(shè)置的主要功能碼如下①130請(qǐng)求設(shè)備發(fā)送線路狀態(tài),在監(jiān)控程序中使用BZ變量區(qū)分請(qǐng)求,BZ = 1,線路信息,BZ = 2,坐席信息,并根據(jù)BZ位改變對(duì)應(yīng)位圖顯示。②131請(qǐng)求設(shè)備發(fā)送坐席狀態(tài)信息,在監(jiān)控程序中使用BZ變量區(qū)分請(qǐng)求,BZ = 1,線路信息,BZ = 2,坐席信息,并根據(jù)BZ位改變對(duì)應(yīng)位圖顯示。③132請(qǐng)求設(shè)備發(fā)送工作量信息④133發(fā)送PCM設(shè)置信息給通信設(shè)備,00代表開(kāi)放線路,55代表閉鎖線路⑤134發(fā)送坐席設(shè)置信息給通信設(shè)備,00代表開(kāi)放坐席,55代表閉鎖坐席......2、設(shè)計(jì)定時(shí)器當(dāng)需要每隔一段時(shí)間執(zhí)行一件事件的的時(shí)候就需要使用ktTimer函數(shù)設(shè)置定時(shí)器。本發(fā)明中采用設(shè)置定時(shí)器,并應(yīng)用定時(shí)器去控制串口讀寫,即每隔一定時(shí)間間隔去讀一次串口或?qū)懸淮未?。使用定時(shí)器的方法比較簡(jiǎn)單,通常告訴WINDOWS—個(gè)時(shí)間間隔,然后 WINDOWS根據(jù)時(shí)間間隔周期性觸發(fā)程序,即發(fā)送WM_TIMER消息。主程序中循環(huán)掃描消息,掃描到WM_TIMER消息,即知道間隔時(shí)間到了,轉(zhuǎn)去讀串口或?qū)懘凇etTimer函數(shù)的原型UINT_PTR SetTimer (HWND hffnd,//窗口句柄UINT_PTR nIDEvent, //定時(shí)器ID,多個(gè)定時(shí)器時(shí),可以通過(guò)該ID判斷是哪個(gè)定時(shí)器UINT uElapse,//時(shí)間間隔,單位為毫秒TIMERPROC IpTimerFunc//回調(diào)函數(shù));1)本程序設(shè)置三個(gè)定時(shí)器,設(shè)計(jì)程序如下①設(shè)置定時(shí)器1,如設(shè)置不成功則彈出出錯(cuò)對(duì)話框,提示定時(shí)器設(shè)置不成功,重新設(shè)置。while( ! SetTimer(hffnd, IDM_TIME1, 500, NULL)){if (IDCANCEL == MessageBox (hffnd,‘‘ Timerl Error“ , ‘‘ return“,MB_RETRYCANCEL|MB_IC0NEXCLAMATI0N))return FALSE ;}②設(shè)置定時(shí)器2,如設(shè)置不成功則彈出出錯(cuò)對(duì)話框,提示定時(shí)器設(shè)置不成功,重新設(shè)置。while( ! SetTimer(hffnd, IDM_TIME2,100, NULL)){if (IDCANCEL = = MessageBox (hffnd,“ Timer2 Error",“ RETURN",MB_RETRYCANCEL|MB_IC0NEXCLAMATI0N))return FALSE ;}③設(shè)置定時(shí)器3,如設(shè)置不成功則彈出出錯(cuò)對(duì)話框,提示定時(shí)器設(shè)置不成功,重新設(shè)置。while( ! SetTimer(hffnd, IDM_TIME3,50, NULL)){if (IDCANCEL = = MessageBox (hffnd,“ Timer3 Error",“ RETURN",MB_RETRYCANCEL|MB_IC0NEXCLAMATI0N))return FALSE ;}定時(shí)器4、5的設(shè)置方式同上。不在贅述。在設(shè)計(jì)定時(shí)器時(shí)間間隔時(shí)要兼顧到,串口對(duì)數(shù)據(jù)的處理速度,避免讀串口數(shù)據(jù)未讀完,又轉(zhuǎn)去執(zhí)行寫串口數(shù)據(jù)程序。因此設(shè)計(jì)的間隔時(shí)間要足夠保證必須處理的數(shù)據(jù)處理完。本設(shè)計(jì)中分別設(shè)置了 500,100,50三種間隔,經(jīng)運(yùn)行,可確保數(shù)據(jù)的執(zhí)行。解決此類問(wèn)題的另一種方法是用完一個(gè)定時(shí)器后及時(shí)關(guān)閉,等待再次用到時(shí)重新打開(kāi)。在程序結(jié)束時(shí),刪除定時(shí)器,其實(shí)現(xiàn)方式如下刪除定時(shí)器1、2、3 (定時(shí)器4、5刪除方式相同,省略)KillTimer (hffnd, IDM_TIME1);KillTimer (hffnd, IDM_TIME2);KillTimer (hffnd, IDM_TIME3);3、串口通信程序設(shè)計(jì)創(chuàng)建程序中設(shè)置窗口,和功能按鈕,設(shè)置定時(shí)器,完成一系列初始化工作。①串口初始化
I、打開(kāi)串口,,并設(shè)置輸入輸出緩沖區(qū)大小idComDev = CreateFiIe ( “ com2 〃,GENERIC_READ|GENERIC_WRITE,0,NULL, 0PEN_EXISTING,0, NULL) ;//打開(kāi)串口SetupCommidComDev,, 4, 2) ;//設(shè)置輸入、輸出緩沖區(qū)的大小(傳送坐席信息時(shí))或SetupCommidComDev,, 64,64) ;//設(shè)置輸入、輸出緩沖區(qū)的大小(傳送線路狀態(tài)信息時(shí))II、配置串口BuildCommDcb (“ com2 300, η, 8,1",&dcb) ;//創(chuàng)建數(shù)據(jù)控制塊 DCB 結(jié)構(gòu),波特
率//300,每次傳送一字節(jié)數(shù)據(jù), 即8位III、定義塊SetCommState (idComDev, &dcb);完成串口初始化。②消息循環(huán)串口初始化完成后程序進(jìn)入消息循環(huán)。、其實(shí)現(xiàn)語(yǔ)句如下Showffindow (hffnd, Sff_SHOWMAXIMIZED);顯示窗口并發(fā)送消息程序主窗口Updateffindow (hffnd) ;WM_PAINTwhile (GetMessage (&msg, NULL, 0,0))進(jìn)入消息循環(huán)if( ! IsDialogMessage (hffnd, &msg)){TranslateMessage(&msg);DispatchMessage(&msg);}return msg. wParam ;}采用循環(huán)方式查詢各種消息,并實(shí)時(shí)處理消息,如果此時(shí)接收到和定時(shí)器有關(guān)的 WM.TIMER消息,則轉(zhuǎn)去執(zhí)行相應(yīng)處理程序,其程序設(shè)計(jì)如下case WM_TIMER 定時(shí)器信息來(lái)switch (wParam)判斷是定時(shí)器幾{case IDM_TIME1 //timel ks{if(bz ==1) 是定時(shí)器1且選線路PCM狀態(tài)(用BZ變量取值,判斷是 PCM狀態(tài)還是坐席ZX狀態(tài)){
rect. left = 205 ; 更新屏幕rect. right = 552 ;rect. top = 320 ;rect. bottom = 386 ;if (zl == TRUE)InvalidateRect (hffnd, &rect, FALSE);}if (sionumb ! = 0){yuan
= outsio[sionumb-l];sionumb = sionumb-1 ;PurgeComm(idComDev, PURGE_TXAB0RT|PURGE_RXAB0RT|PURGE_TXCLEAR|PURGE_ RXCLEAR) ;//清除輸出緩沖區(qū)WriteFile (idComDev, yuan, 1,xnumb, NULL) -J/ 寫串口,即送出功能碼 130(程序初始化時(shí)定義//功能碼,每個(gè)功能的功能碼各不相同),請(qǐng)求設(shè)備Il送線路狀態(tài)信息}}break ;//timel endcase IDM_TIME2 是定時(shí)器 2 則讀串口{PurgeComm(idComDev, PURGE_TXAB0RT|PURGE_RXAB0RT|PURGE_TXCLEAR|PURGE_ RXCLEAR) ;//清除輸入緩沖區(qū)if (ReadFiIe (idComDev, bin, 1,dnumb, NULL) ==1)switch (bz)對(duì)讀入的信息進(jìn)行分析{case 1://線路狀態(tài),約定設(shè)備回送一字節(jié)內(nèi)容, 其中D7 D6 D5線路狀態(tài)//D4D3D2D1D0 線路號(hào)應(yīng)小于 30*/{if(beginb < 8) break ;取數(shù)據(jù)、分析數(shù)據(jù)y = (bin
>> 5)&7 ;并控制畫筆對(duì)改動(dòng)部份進(jìn)行狀態(tài)
更新i = bin
&0xlf ;
if (i < 30&&pcmst[i] ! = y){if (pcmst [i] = = 0&&y < 2) //根據(jù)y值判斷線路處于呼入還是應(yīng)答狀態(tài){pcmnu [i] = pcmnu [i] +1 ;hrnumb = hrnumb+1 ;// 呼入工作量力口 1}if (y == 2){ydnumb = ydnumb+1 ;// 應(yīng)答工作量力口 1if (mlst[i] ==0)hrnumb = hrnumb+1 ;}pcmst [i] = y ;Il更新線路狀態(tài)變量數(shù)據(jù)χ = i ;y = 0 ;while (χ > 9)//在對(duì)應(yīng)位置更新屏幕顯示{χ = χ-10 ;y++ ;}rect. left = χ氺54+39 ;rect. right = rect. left+57 ;rect. top = y*66+84+20 ;rect. bottom = rect. top+76 ;InvalidateRect (hffnd, &rect, FALSE);}}break ;case 2//如果送回的是坐席信息(一字節(jié)),,約定D7 D4為坐席狀態(tài)//信息,D3 DO為坐席號(hào)y = (bin
>> 4)&15 ; //根據(jù)接收狀態(tài)信息,更新屏幕顯示zxst [y] = bin
&15 ;If (y > 7){y = (y&7)+l ;χ = 0 ;While (y > 1){y = y-2 ;χ = x+1 ;}Rect. left = y*223+192 ;Rect. right = rect. left+100 ;Rect. top = x*45+147 ;
Rect. bottom = rect. top+23 ;InvalidateRECT (hffnd, &rect, FALSE);Break ;}
}}Return 0 ;}//switch bz endbreak ;//time2 end}是定時(shí)器3來(lái)消息,處理方式同上,請(qǐng)求設(shè)備送工作量信息。讀取工作量。工作量信息,如總呼入量信息,在傳送過(guò)程中采用四字節(jié)完成,其數(shù)據(jù)約定如下第3字節(jié)D7D6 = 11D5 DO 工作量低六位第2字節(jié)D7D6 = 10D5 DO 工作量中六位第1字節(jié)D7D6 = 01D5 工作量高一位D4 DO地址高五位第0字節(jié)D7D6 = 00D5 DO 地址低6位對(duì)工作量進(jìn)行存儲(chǔ),其實(shí)現(xiàn)程序如下hFile = OpenFile (〃 c:\〃 work, dat 〃,&ofs,0F_WRITE);_llseek(hFile, ((timework[i] [2]_l)*24+timework[i] [3]*32,0);for(j = 1 ;j < 17' j++){_write (hFile, &g21workl [i] [j],2);_Iclose (hFile);}③退出處理對(duì)消息的處理完成后,結(jié)束退出時(shí),刪除定時(shí)器1、2、3......,退出消息循環(huán)。其實(shí)
現(xiàn)語(yǔ)句如下case ESC 按下子按紐退出則for(i = 0 ;i < 10 ;i++)使主功能鍵可選Enableffindow (hbutton[i], TRUE);Delebitmap (bz);刪除字位圖、畫筆bzl = 0 ;zl = FALSE ;CloseHandle (idComDev);關(guān)串口InvalidateRect (hffnd, NULL, FALSE);return 0 ;}break ;}
case WM_DESTR0Y 退出主窗口時(shí)處理DeleteObject(HBJ) ;1.刪背景位圖if ( ! bz)Delebitmap (bz) ;2.刪當(dāng)前位圖KillTimer (hffnd, IDM_TIME1) ; 3.刪定時(shí)器 1、2、3KillTimer (hffnd, IDM_TIME2);KillTimer (hffnd, IDM_TIME3);PostQuitMessage (0) ;4.發(fā)退出消息置主程序return 0 ;消息循環(huán)4、監(jiān)控顯示及管理程序設(shè)計(jì) 其程序流程圖如圖4所示。 它所使用的函數(shù)有1).Bool Port Init(Handle hw, intbpl, int bp2);用于設(shè)置串行工作狀態(tài),初始化串行口,初始化不正確給出錯(cuò)誤提示。2). Clea button(void)用于清除與之相對(duì)應(yīng)在退出功能時(shí)的按紐3). Bool LB(int bitl)畫筆在進(jìn)入某個(gè)子功能時(shí),用于裝入某個(gè)位圖4). BoolDele bitmap ()在退出某個(gè)子功能時(shí),刪除每個(gè)子功能畫筆位圖5). Void setupButton(void)在進(jìn)入某項(xiàng)功能所需要的按紐 它所使用的對(duì)話框有1). MLF2DLGPR0C 模擬用戶線分組對(duì)話框2). 2XF2DLGPR0C 座席分組對(duì)話框3). XF2DLGPR0C 線路分組對(duì)話框用于分組功能時(shí),通過(guò)對(duì)話框選擇相應(yīng)分組路數(shù),分組類型4). BSHELPDLGPR0C 提示閉塞功能時(shí)的幫助信息5). 2XBSDLGPR0C用戶模擬線閉塞功能,選擇時(shí)彈出的對(duì)話框6). 2XBSDLGPR0C座席線閉塞功能,選擇時(shí)彈出的對(duì)話框7). XLBSDLGPR0C數(shù)字線路閉塞功能,選擇時(shí)彈出的對(duì)話框在閉塞設(shè)置時(shí),通過(guò)對(duì)話框選擇相應(yīng)閉塞或開(kāi)放線路 它所處理的消息類型有1) case WM_CREATE //在創(chuàng)建窗口時(shí)創(chuàng)建10個(gè)功能按紐2) case WM_C0MMAND //收到命令信息分析信息3) case WM_TIMER //定時(shí)器信息來(lái)的處理4) case WM_PAINT //畫筆處理5) case WM_DESTR0Y //退出主窗口時(shí)處理
權(quán)利要求
1.一種對(duì)通信特服終端設(shè)備進(jìn)行實(shí)時(shí)監(jiān)控的實(shí)現(xiàn)方法,其特征是使用串口通信技術(shù)實(shí)現(xiàn)通信特服終端設(shè)備與監(jiān)控機(jī)之間的實(shí)時(shí)數(shù)據(jù)傳輸,以及BORLANDC C++BUILDER軟件環(huán)境中實(shí)現(xiàn)如下步驟操作1)設(shè)計(jì)串口通信硬件電路;2)設(shè)計(jì)串口通信程序?qū)崿F(xiàn)串口通信;3)設(shè)計(jì)定時(shí)器,實(shí)現(xiàn)串口控制;4)設(shè)計(jì)實(shí)時(shí)更新顯示及控制管理程序。
2.根據(jù)權(quán)利要求1所述的串口通信硬件電路,其特征是所述步驟1)中,設(shè)計(jì)通信特服終端機(jī)的接口,設(shè)計(jì)監(jiān)控機(jī)端接口,以實(shí)現(xiàn)數(shù)據(jù)的交換。實(shí)現(xiàn)設(shè)計(jì)的步驟是1)串口通信硬件電路設(shè)計(jì)通信終端設(shè)備端采用8051系列單片機(jī),監(jiān)測(cè)機(jī)端采用80X86系列主機(jī),選擇RS232進(jìn)行串口通信,選擇MAX238作為接口芯片,其結(jié)構(gòu)示意圖如圖1所示。2)串口通信傳送數(shù)據(jù)格式設(shè)計(jì)①線路狀態(tài)信息約定設(shè)備回送一字節(jié)內(nèi)容,其中D7 D6 D5線路狀態(tài)信息,D4D3D2D1D0為線路號(hào),線路號(hào)應(yīng)小于30。②坐席狀態(tài)信息約定設(shè)備回送一字節(jié)內(nèi)容,約定D7D6D5D4為坐席狀態(tài)信息,D3D2D0為坐席號(hào)。③工作量信息工作量信息,在傳送過(guò)程中采用四字節(jié)完成,其數(shù)據(jù)約定如下 第3字節(jié)D7D6=11 D5 DO 工作量低六位第2字節(jié)D7D6 =10 D5 DO 工作量中六位第1字節(jié)D7D6 = 01 D5 工作量高一位D4 DO地址高五位第0字節(jié)D7D6 = 00 D5 DO 地址低6位④線路控制信息約定監(jiān)控機(jī)送一字節(jié)內(nèi)容給通信特服終端設(shè)備,00代表開(kāi)放線路,55代表閉鎖線路。⑤坐席控制信息約定監(jiān)控機(jī)送一字節(jié)內(nèi)容給通信特服終端設(shè)備,00代表開(kāi)放坐席,55代表閉鎖坐席。3)主要功能碼設(shè)計(jì)①130請(qǐng)求設(shè)備發(fā)送線路狀態(tài)。②131請(qǐng)求設(shè)備發(fā)送坐席狀態(tài)信息。③132請(qǐng)求設(shè)備發(fā)送工作量信息。④133發(fā)送PCM設(shè)置信息給通信設(shè)備。00代表開(kāi)放線路,55代表閉鎖線路。⑤134發(fā)送坐席設(shè)置信息給通信設(shè)備。00代表開(kāi)放坐席,55代表閉鎖坐席。
3.根據(jù)權(quán)利要求1所述的對(duì)通信特服終端設(shè)備進(jìn)行實(shí)時(shí)監(jiān)控的實(shí)現(xiàn)方法,其特征是所述步驟2)中,設(shè)計(jì)串口通信程序?qū)崿F(xiàn)串口通信,具體實(shí)施步驟如下①打開(kāi)串口HANDLE CreateFile(LPCTSTR IpFileName,//IpFileName 將要打開(kāi)的串口邏輯名,如“C0M1,,;DWORD dwDesiredAccess, //dwDesiredAccess 指定串口訪問(wèn)的類型,可以是讀取、寫//入或二者并列;DWORD dwShareMode,//dwShareMode 指定共享屬性,由于串口不能共享,該參數(shù)Il必須置為ο ;LPSECURITY_ATTRIBUTESIpSecurityAttributes, //IpSecurityAttributes 弓丨用安全性屬性Il結(jié)構(gòu),缺省值為NULL; DWORD dwCreationDistribution, //dwCreationDistribution 創(chuàng)建標(biāo)志,對(duì)串口操作該參數(shù)// 必須置為 0PEN_EXISTING ; DWORD dwFlagsAndAttributes, //dwFlagsAndAttributes 屬性描述,用于指定該串口是//否進(jìn)行異步操作,該值為FILE_FLAG_OVERLAPPEDIl表示使用異步的I/O ;該值為0,表示同步I/O操作;HANDLE MemplateFile)//MemplateFile 對(duì)串口而言該參數(shù)必須置為NULL ;②配置串口BuildCommDCB ( "COM2 :9600, N,8,1”,&dcb);③設(shè)置通信口狀態(tài) B00L SetCommState(HANDLE hFile, //通信設(shè)備句柄 LPDCB IpDCB//指針指向DCB結(jié)構(gòu)塊);④清除通信接收或發(fā)送緩沖區(qū) BOOLPurgeComm( HANDLEhFile, //串口句柄DWORD dwFlags) //需要完成的操作參數(shù)dwFlags指定要完成的操作,可以是下列值的組合PURGE_TXAB0RT中斷所有寫操作并立即返回,即使寫操作還沒(méi)有完成;PURGE_RXAB0RT中斷所有讀操作并立即返回, 即使讀操作還沒(méi)有完成;PURGE_T)(CLEAR清除輸出緩沖區(qū) PURGE_RXCLEAR清除輸入緩沖區(qū)⑤恢復(fù)或取得通信口狀態(tài)BOOL ClearCommError(HANDLE hFile,//通信設(shè)備句柄LPDffORD IpErrors,//指針指向接收錯(cuò)誤代碼LPCOMSTAT IpStat//指針指向通信狀態(tài)數(shù)據(jù)緩存區(qū));⑥從通信接收緩沖區(qū)讀字符 BOOL ReadFile(HANDLE hFile, //串口的句柄LPVOID IpBuffer,//保存讀入數(shù)據(jù)的指針DWORD nNumberOfBytesToRead,//要讀入的數(shù)據(jù)的字節(jié)數(shù)LPDffORD IpNumberOfBytesRead, // 實(shí)際讀入的字節(jié)數(shù) LPOVERLAPPED IpOverlapped)//OVERLAPPED,同步為 NULL⑦向通信發(fā)送緩沖區(qū)寫字符 BOOL WriteFile(HANDLE hFile,//串口的句柄LPCVOIDlpBuffer,//要寫入數(shù)據(jù)的地址DWORD nNumberOfBytesToffrite, //要寫入數(shù)據(jù)的字節(jié)數(shù) LPDffORD IpNumberOfBytesffritten, // 實(shí)際寫入的字節(jié)數(shù) LPOVERLAPPEDlpOverlapped)//OVERLAPPED,同步為 NULL。⑧關(guān)閉通信串口 CloseHandle (hComm)。
4.根據(jù)權(quán)利要求1所述的對(duì)通信特服終端設(shè)備進(jìn)行實(shí)時(shí)監(jiān)控的實(shí)現(xiàn)方法,其特征是所述步驟3)中,設(shè)計(jì)定時(shí)器,實(shí)現(xiàn)串口控制,其具體實(shí)施步驟如下①設(shè)置定時(shí)器1,如設(shè)置不成功則彈出出錯(cuò)對(duì)話框,提示定時(shí)器設(shè)置不成功,重新設(shè)置。while( ! SetTimer(hffnd, IDM_TIME1,500, NULL)){if (IDCANCEL = = MessageBox(hffnd, “Timerl Error“ , “ return“, MB_RETRYCANCEL|MB_IC0NEXCLAMATI0N)) return FALSE ;}②設(shè)置定時(shí)器2,如設(shè)置不成功則彈出出錯(cuò)對(duì)話框,提示定時(shí)器設(shè)置不成功,重新設(shè)置。while ( ! SetTimer (hffnd, IDM_TIME2,100, NULL)){if (IDCANCEL = = MessageBox(hffnd, “Timer2 Error" , “ RETURN", MB_RETRYCANCEL|MB_IC0NEXCLAMATI0N)) return FALSE ;}③設(shè)置定時(shí)器3,如設(shè)置不成功則彈出出錯(cuò)對(duì)話框,提示定時(shí)器設(shè)置不成功,重新設(shè)置。while ( ! SetTimer (hffnd, IDM_TIME3, 50, NULL)){if (IDCANCEL = = MessageBox(hffnd, “Timer3 Error" , “ RETURN", MB_RETRYCANCEL|MB_ICONEXCLAMATION)) return FALSE ;}定時(shí)器4、5的設(shè)置方式同上。不在贅述。
5.根據(jù)權(quán)利要求1所述的對(duì)通信特服終端設(shè)備進(jìn)行實(shí)時(shí)監(jiān)控的實(shí)現(xiàn)方法,其特征是所述步驟4)中,實(shí)時(shí)更新顯示及控制管理程序,其具體實(shí)施步驟如下①其程序流程圖如圖4所示。②它所使用的函數(shù)有a)BoolPort Init (Handle hw,intbpl,int bp2);用于設(shè)置串行工作狀態(tài),初始化串行口,初始化不正確給出錯(cuò)誤提示。b)Cleabutton(void)用于清除與之相對(duì)應(yīng)在退出功能時(shí)的按紐。c)BoolLB(int bitl)畫筆在進(jìn)入某個(gè)子功能時(shí),用于裝入某個(gè)位圖。d)BoolDele bitmap ()在退出某個(gè)子功能時(shí),刪除每個(gè)子功能畫筆位圖。e)Void setupButton(void) 在進(jìn)入某項(xiàng)功能所需要的按紐。③它所使用的對(duì)話框有a)MLF2DLGPR0C模擬用戶線分組對(duì)話框b)2XF2DLGPR0C座席分組對(duì)話框c)XF2DLGPR0C線路分組對(duì)話框,用于分組功能時(shí),通過(guò)對(duì)話框選擇相應(yīng)分組路數(shù),分組類型d)BSHELPDLGPROC 提示閉塞功能時(shí)的幫助信息e)2XBSDLGPR0C用戶模擬線閉塞功能,選擇時(shí)彈出的對(duì)話框f)2XBSDLGPR0C座席線閉塞功能,選擇時(shí)彈出的對(duì)話框g)XLBSDLGPROC數(shù)字線路閉塞功能,選擇時(shí)彈出的對(duì)話框在閉塞設(shè)置時(shí),通過(guò)對(duì)話框選擇相應(yīng)閉塞或開(kāi)放線路④它所處理的消息類型有a)case WM_CREATE //在創(chuàng)建窗口時(shí)創(chuàng)建10個(gè)功能按紐b)case WM_COMMAND //收到命令信息分析信息c)case WM_TIMER //定時(shí)器信息來(lái)的處理d)caseWM_PAINT // 畫筆處理e)case WM_DESTROY //退出主窗口時(shí)處理。
全文摘要
通信數(shù)據(jù)在傳輸過(guò)程中,需要對(duì)通信特服終端設(shè)備的工作狀態(tài)進(jìn)行實(shí)時(shí)的監(jiān)測(cè),以便發(fā)現(xiàn)故障及時(shí)反饋、及時(shí)修理。在溝通通信設(shè)備和監(jiān)控機(jī)時(shí)常用的數(shù)據(jù)交換方式有許多,如無(wú)線通信技術(shù)、基于網(wǎng)絡(luò)的數(shù)據(jù)傳輸技術(shù)、和串口通信技術(shù)等。采用串口通信技術(shù),具有成本低、保密性強(qiáng)、安全穩(wěn)定等優(yōu)點(diǎn),因此本發(fā)明在監(jiān)控通信特服終端設(shè)備時(shí)采用串口通信技術(shù),即采用監(jiān)控計(jì)算機(jī)與通信特服終端之間進(jìn)行串口通信,實(shí)時(shí)地從通信終端設(shè)備中傳出狀態(tài)信息,監(jiān)控機(jī)接收數(shù)據(jù)并實(shí)時(shí)顯示狀態(tài);在監(jiān)控機(jī)端可以人為發(fā)出指令,進(jìn)行線路或坐席的調(diào)度、控制等管理工作。監(jiān)控機(jī)端采用BORLANDC C++BUILDER語(yǔ)言編程實(shí)現(xiàn)屏幕實(shí)時(shí)更新、監(jiān)控管理工作;在通信特服終端設(shè)備與監(jiān)控機(jī)間采用RS232串口通信技術(shù)進(jìn)行數(shù)據(jù)交換,雙方對(duì)數(shù)據(jù)格式進(jìn)行約定,采用功能碼區(qū)分各種菜單按鈕功能。
文檔編號(hào)H04M3/22GK102467432SQ20101053461
公開(kāi)日2012年5月23日 申請(qǐng)日期2010年11月4日 優(yōu)先權(quán)日2010年11月4日
發(fā)明者周琳 申請(qǐng)人:周琳