| 注冊(cè)| 產(chǎn)品展廳| 收藏該商鋪

行業(yè)產(chǎn)品

當(dāng)前位置:
湖南嶸晟時(shí)代自動(dòng)化科技有限公司>>技術(shù)文章>>基于Windows環(huán)境的實(shí)時(shí)串行通訊

基于Windows環(huán)境的實(shí)時(shí)串行通訊

閱讀:673        發(fā)布時(shí)間:2021-8-9

                     基于Windows環(huán)境的實(shí)時(shí)串行通訊

一、概述

隨著電力電子技術(shù)和計(jì)算機(jī)技術(shù)的發(fā)展,各種各樣的智能終端也出現(xiàn)了。但智能終端管理功能較小,需要將其檢測(cè)與控制的參數(shù)送到計(jì)算機(jī)上進(jìn)行管理,為克服各廠家設(shè)備的不兼容性,一般采用標(biāo)準(zhǔn)RS-232C接口串行通訊來(lái)傳送數(shù)據(jù),由于在實(shí)時(shí)性方面具有嚴(yán)格的要求,所以大多數(shù)的工控軟件還是基于DOS環(huán)境的,其綜合性能對(duì)于Windows程序就弱一些,造成這種現(xiàn)象的原因在于,在Windows環(huán)境中,系統(tǒng)接管了中斷,所有資源均由其統(tǒng)一管理,以便多個(gè)程序共享,它通過(guò)設(shè)備驅(qū)動(dòng)程序?yàn)橛脩?hù)提供標(biāo)準(zhǔn)的外設(shè)接口,禁止程序員通過(guò)Windows直接訪問(wèn)內(nèi)存和外設(shè)?;诖宋奶岢隽嗽赪indows下響應(yīng)硬件中斷的串行通訊的方法,并針對(duì)不同語(yǔ)言的特點(diǎn),用BorlandC++編制程序?qū)Χ丝谥苯硬僮?,并響?yīng)執(zhí)行硬件中斷程序接收數(shù)據(jù),利用DDE(動(dòng)態(tài)數(shù)據(jù)交換)將數(shù)據(jù)傳送給用Delphi編制的程序處理數(shù)據(jù),將其加入數(shù)據(jù)庫(kù),建立實(shí)時(shí)數(shù)據(jù)庫(kù)、動(dòng)態(tài)顯示、打印及報(bào)警等。

二、串行通訊的原理

圖1 串行通訊口的連接

如圖1所示,串行通訊口的連接采用七根線直接連接方式,通過(guò)兩對(duì)應(yīng)答信號(hào)線相連,可進(jìn)行全雙工傳輸。UART是可編程的異步串行通信芯片。用戶(hù)對(duì)其編程實(shí)際上是對(duì)UART內(nèi)部寄存器的讀出或?qū)懭氩僮?。CPU可通過(guò)相應(yīng)的輸入輸出指令對(duì)UART內(nèi)部寄存器訪問(wèn)。通過(guò)訪問(wèn)寄存器可初始化串行口、發(fā)送數(shù)據(jù)、接收數(shù)據(jù)、檢測(cè)線路設(shè)備狀態(tài)以達(dá)到通訊的目的。其端口地址名稱(chēng)如表1所示(以串行口2為例)。

表1 UART內(nèi)部寄存器端口分配

端口地址

指令

寄存器名稱(chēng)及作用

2F8HOUT寫(xiě)入發(fā)送保持寄存器
2F8HIN讀出接收數(shù)據(jù)寄存器
2F8HOUT寫(xiě)入波特率因子(LSB)
2F9HOUT寫(xiě)入波特率因子(MSB)
2F9HOUT寫(xiě)入中斷允許寄存器
2FAHIN讀出中斷標(biāo)識(shí)寄存器
2FBHOUT寫(xiě)入線路控制寄存器
2FCHOUT寫(xiě)入MODEM控制寄存器
2FDHIN讀出線路狀態(tài)寄存器

二、通訊的實(shí)現(xiàn)

一般通訊軟件采用的協(xié)議是這樣的:

  • 發(fā)送者定時(shí)向串行口發(fā)送數(shù)據(jù);

  • 接收者以中斷方式或查詢(xún)方式讀取數(shù)據(jù);

  • 接收者將讀取的數(shù)據(jù)發(fā)送給發(fā)送者;

  • 發(fā)送者將原發(fā)送數(shù)據(jù)與接收者發(fā)送的數(shù)據(jù)進(jìn)行比較,如果一致則發(fā)送一個(gè)成功的標(biāo)志給接收者,繼續(xù)發(fā)送數(shù)據(jù),否則發(fā)送一個(gè)失敗的標(biāo)志給接收者,再重發(fā)送數(shù)據(jù);

  • 重復(fù)1-4的過(guò)程直到數(shù)據(jù)傳送完成。

但這種傳送方式由于智能終端的速度處理數(shù)據(jù)較慢及協(xié)議繁瑣以致傳送速率變慢,且使智能終端程序變得復(fù)雜。為加快速度,本文將上述通訊協(xié)議進(jìn)行了一些修改,利用計(jì)算機(jī)計(jì)算速度快的特點(diǎn),由計(jì)算機(jī)進(jìn)行數(shù)據(jù)處理,并采用異步通訊中斷方式接收,以增加接收數(shù)據(jù)的可靠性。其通訊協(xié)議如下:

  • 發(fā)送者定時(shí)傳送兩個(gè)相同帶結(jié)束標(biāo)志數(shù)據(jù);

  • 接收者以中斷方式讀取這兩個(gè)數(shù)據(jù),并進(jìn)行比較,如一致則發(fā)送一個(gè)成功的標(biāo)志給發(fā)送者,否則發(fā)送一個(gè)失敗的標(biāo)志給接收者,再重發(fā)送數(shù)據(jù)。

異步通訊中斷接收程序主要由通訊中斷初始化程序和通訊中斷服務(wù)程序兩部分組成。

1、通訊中斷初始化程序

通訊中斷初始化程序安排在整個(gè)通訊程序之前,它的工作如圖2所示,首先修改中斷向量表,按使用的串行口COM2,接管中斷0BH,使新的中斷向量指向自行編制的通訊中斷程序;其次確定UART操作方式,設(shè)置中斷寄存器相應(yīng)位的允許或禁止,并允許中斷操作;第三確定通訊波特率及數(shù)據(jù)幀傳輸格式;最后對(duì)中斷控制器的屏蔽寄存器編程,允許中斷IRQ3。必須注意在應(yīng)用程序終止退出時(shí),從變量中獲取原中斷向量恢復(fù)到中斷向量表中,否則將引起系統(tǒng)死機(jī)。

圖2 通訊中斷初始化流程圖

2、通訊中斷服務(wù)程序

圖3 通訊中斷服務(wù)程序流程

通訊中斷服務(wù)程序如圖3所示,當(dāng)智能終端有數(shù)據(jù)發(fā)送時(shí),引起硬件中斷執(zhí)行中斷服務(wù)程序。當(dāng)接收數(shù)據(jù)就緒時(shí),將接收數(shù)據(jù)放入緩沖區(qū),且接收到結(jié)束標(biāo)志時(shí),發(fā)出一個(gè)用戶(hù)消息到應(yīng)用程序隊(duì)列中,由應(yīng)用程序繼續(xù)處理數(shù)據(jù),以便使中斷服務(wù)程序時(shí)間盡量壓縮到最小,讓其他應(yīng)用程序獲得CPU的服務(wù)。在中斷返回前應(yīng)向中斷控制器發(fā)出結(jié)束中斷命令,否則以后將屏蔽對(duì)同級(jí)中斷和低一級(jí)中斷的處理,只能接收一次數(shù)據(jù)。

異步通訊中斷接收程序代碼由Borland C++編制。利用inportb和outportb函數(shù)對(duì)表1中所列出的端口地址直接操作初始化和讀取數(shù)據(jù),用interrupt函數(shù)設(shè)置自己的中斷服務(wù)程序接收數(shù)據(jù)。另外由于對(duì)端口的直接操作,也使得執(zhí)行中斷服務(wù)程序的時(shí)間減少,以致CPU能獲得充分利用。

三、動(dòng)態(tài)數(shù)據(jù)交換及數(shù)據(jù)處理

動(dòng)態(tài)數(shù)據(jù)交換是Windows提供的一種利用共享內(nèi)存進(jìn)行程序間數(shù)據(jù)交換或傳遞信息的方法,它充分體現(xiàn)了Windows的多任務(wù)優(yōu)點(diǎn),使得各應(yīng)用程序間的數(shù)據(jù)傳遞可以隨時(shí)方便地進(jìn)行,尤其適合于程序間動(dòng)態(tài)數(shù)據(jù)的傳遞。本文利用了Microsoft公司在Windows 31下推出的動(dòng)態(tài)數(shù)據(jù)交換管理庫(kù)DDEML來(lái)實(shí)現(xiàn)程序間的動(dòng)態(tài)數(shù)據(jù)交換。它使得所有的DDE程序采用了同樣的方式交換數(shù)據(jù),增加了程序的可靠性,使得用Borland C++編制的程序和Delphi編制的程序進(jìn)行動(dòng)態(tài)數(shù)據(jù)交換成為了可能。

本文以Borland C++編制的DDE客戶(hù)程序?yàn)閿?shù)據(jù)源,一旦接收數(shù)據(jù)正確立即將數(shù)據(jù)傳送給Delphi編制的DDE服務(wù)器程序處理。

1、編寫(xiě)DDE客戶(hù)程序

(1)初始化

客戶(hù)程序在使用DDEML函數(shù)前必須進(jìn)行初始化,進(jìn)行初始化可調(diào)用DdeInitialize函數(shù),可如下操作:

DdeInitialize(&idInst,(PFNCALLBACK)lpCallBack,APPCMDCLIENTONLY,0);

其中idInst為客戶(hù)程序需要保護(hù)的此呈現(xiàn)戶(hù)的標(biāo)識(shí)符地址,標(biāo)識(shí)符的值由DDEML給出;lpCallBack為回調(diào)函數(shù)的地址;APPCMDCLIENTONLY指明此程序的性質(zhì)。

另外創(chuàng)建服務(wù)名、話題名及項(xiàng)目名句柄:

hszService=DdeCreateStringHandle(idInst,"Server",CP[CD#*2]WINANSI);

hszTopic=DdeCreateStringHandle(idInst,"DdeServer",CP[CD#*2]WINANSI);

hszItem=DdeCreateStringHandle(idInst,"DdeServerIteml",CP[CD#*2]WINANSI);

(2)建立會(huì)話

調(diào)用DdeConnect建立單個(gè)會(huì)話:

hConv=DdeConnect(idInst,hszService,hszTopic,NULL);

這里idInst是客戶(hù)程序在調(diào)用DdeInitalize時(shí)由DDEML傳遞過(guò)來(lái)的代表客戶(hù)程序的標(biāo)識(shí)符;hszService是服務(wù)名字符串的句柄;hszTopic是話題名字符串的句柄。

(3)向服務(wù)器傳遞數(shù)據(jù)

DdeClientTransaction((LPBYTE)szData,strlen(szData)+1,hConv,hszItem,

CF[CD#*2]TEXT,XTYP[CD#*2]POKE,0,NULL)

這里SzData是需傳遞的字符串指針;strlen(szData)+1是數(shù)據(jù)的大??;hConv是會(huì)話名;hszItem是項(xiàng)目名字符串的句柄;XTYPPOKE是調(diào)用DdeClientTransaction函數(shù)時(shí)事務(wù);CFTEXT是數(shù)據(jù)格式。

(4)會(huì)話結(jié)束

應(yīng)用程序結(jié)束時(shí)需要調(diào)用DdeFreeStringHandle函數(shù)來(lái)釋放所占用的空間,調(diào)用DdeDisConnect函數(shù)結(jié)束會(huì)話。

DdeFreeStringHandle(idInst,hszService);

DdeFreeStringHandle(idInst,hszTopic);

DdeFreeStringHandle(idInst,hszItem);

DdeDisconnect(hConv);

2、編寫(xiě)DDE服務(wù)器及數(shù)據(jù)處理程序

在服務(wù)器Server端的窗體中放一DdeServerItem組件將其屬性Name設(shè)為DdeServerIteml,當(dāng)有數(shù)據(jù)向服務(wù)器傳遞時(shí),觸發(fā)事件OnPokeDate接收處理數(shù)據(jù)。另外Delphi提供了豐富的繪圖功能,利用此特性將接收的數(shù)據(jù)在虛擬界面上顯示數(shù)據(jù)及波形,并對(duì)數(shù)據(jù)進(jìn)行報(bào)警打印,采用客戶(hù)/服務(wù)器形式,使用WINNTF的SQL Server服務(wù)器作為后臺(tái),用Delphi編制程序作為前端工具將數(shù)據(jù)加入數(shù)據(jù)庫(kù),建立實(shí)時(shí)數(shù)據(jù)庫(kù),以便工程人員及管理層通過(guò)網(wǎng)絡(luò)共享數(shù)據(jù)。

四、軟件功能結(jié)構(gòu)

軟件功能結(jié)構(gòu)如圖4所示,程序由通訊程序和數(shù)據(jù)管理程序構(gòu)成,其工作步驟如下:

1、由中斷通訊模塊接收智能終端發(fā)送的數(shù)據(jù)放入緩沖區(qū),并發(fā)出消息。

2、響應(yīng)消息對(duì)數(shù)據(jù)進(jìn)行處理,對(duì)智能終端發(fā)送數(shù)據(jù)正確或錯(cuò)誤標(biāo)志,并將緩沖區(qū)的數(shù)據(jù)經(jīng)DDE客戶(hù)模塊發(fā)送給數(shù)據(jù)管理程序的DDE服務(wù)器模塊。

3、數(shù)據(jù)管理程序?qū)DE服務(wù)器模塊接收的數(shù)據(jù)分別給數(shù)據(jù)庫(kù)模塊、動(dòng)態(tài)顯示模塊、報(bào)警及打印模塊進(jìn)行處理。

圖4 軟件功能模塊圖


收藏該商鋪

請(qǐng) 登錄 后再收藏

提示

您的留言已提交成功!我們將在第一時(shí)間回復(fù)您~
二維碼