三级片视频播放,精品三级片在线观看,A级性爱视频,欧美+日韩+国产+无码+小说,亲子伦XX XX熟女,秋霞最新午夜伦伦A片黑狐,韩国理伦片漂亮的保拇,一边吃奶一边做边爱完整版,欧美放荡性护士videos

| 注冊| 產品展廳| 收藏該商鋪

行業產品

當前位置:
湖南嶸晟時代自動化科技有限公司>>技術文章>>基于Windows環境的實時串行通訊

基于Windows環境的實時串行通訊

閱讀:716        發布時間:2021-8-9

                     基于Windows環境的實時串行通訊

一、概述

隨著電力電子技術和計算機技術的發展,各種各樣的智能終端也出現了。但智能終端管理功能較小,需要將其檢測與控制的參數送到計算機上進行管理,為克服各廠家設備的不兼容性,一般采用標準RS-232C接口串行通訊來傳送數據,由于在實時性方面具有嚴格的要求,所以大多數的工控軟件還是基于DOS環境的,其綜合性能對于Windows程序就弱一些,造成這種現象的原因在于,在Windows環境中,系統接管了中斷,所有資源均由其統一管理,以便多個程序共享,它通過設備驅動程序為用戶提供標準的外設接口,禁止程序員通過Windows直接訪問內存和外設。基于此文提出了在Windows下響應硬件中斷的串行通訊的方法,并針對不同語言的特點,用BorlandC++編制程序對端口直接操作,并響應執行硬件中斷程序接收數據,利用DDE(動態數據交換)將數據傳送給用Delphi編制的程序處理數據,將其加入數據庫,建立實時數據庫、動態顯示、打印及報警等。

二、串行通訊的原理

圖1 串行通訊口的連接

如圖1所示,串行通訊口的連接采用七根線直接連接方式,通過兩對應答信號線相連,可進行全雙工傳輸。UART是可編程的異步串行通信芯片。用戶對其編程實際上是對UART內部寄存器的讀出或寫入操作。CPU可通過相應的輸入輸出指令對UART內部寄存器訪問。通過訪問寄存器可初始化串行口、發送數據、接收數據、檢測線路設備狀態以達到通訊的目的。其端口地址名稱如表1所示(以串行口2為例)。

表1 UART內部寄存器端口分配

端口地址

指令

寄存器名稱及作用

2F8HOUT寫入發送保持寄存器
2F8HIN讀出接收數據寄存器
2F8HOUT寫入波特率因子(LSB)
2F9HOUT寫入波特率因子(MSB)
2F9HOUT寫入中斷允許寄存器
2FAHIN讀出中斷標識寄存器
2FBHOUT寫入線路控制寄存器
2FCHOUT寫入MODEM控制寄存器
2FDHIN讀出線路狀態寄存器

二、通訊的實現

一般通訊軟件采用的協議是這樣的:

  • 發送者定時向串行口發送數據;

  • 接收者以中斷方式或查詢方式讀取數據;

  • 接收者將讀取的數據發送給發送者;

  • 發送者將原發送數據與接收者發送的數據進行比較,如果一致則發送一個成功的標志給接收者,繼續發送數據,否則發送一個失敗的標志給接收者,再重發送數據;

  • 重復1-4的過程直到數據傳送完成。

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

  • 發送者定時傳送兩個相同帶結束標志數據;

  • 接收者以中斷方式讀取這兩個數據,并進行比較,如一致則發送一個成功的標志給發送者,否則發送一個失敗的標志給接收者,再重發送數據。

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

1、通訊中斷初始化程序

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

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

2、通訊中斷服務程序

圖3 通訊中斷服務程序流程

通訊中斷服務程序如圖3所示,當智能終端有數據發送時,引起硬件中斷執行中斷服務程序。當接收數據就緒時,將接收數據放入緩沖區,且接收到結束標志時,發出一個用戶消息到應用程序隊列中,由應用程序繼續處理數據,以便使中斷服務程序時間盡量壓縮到最小,讓其他應用程序獲得CPU的服務。在中斷返回前應向中斷控制器發出結束中斷命令,否則以后將屏蔽對同級中斷和低一級中斷的處理,只能接收一次數據。

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

三、動態數據交換及數據處理

動態數據交換是Windows提供的一種利用共享內存進行程序間數據交換或傳遞信息的方法,它充分體現了Windows的多任務優點,使得各應用程序間的數據傳遞可以隨時方便地進行,尤其適合于程序間動態數據的傳遞。本文利用了Microsoft公司在Windows 31下推出的動態數據交換管理庫DDEML來實現程序間的動態數據交換。它使得所有的DDE程序采用了同樣的方式交換數據,增加了程序的可靠性,使得用Borland C++編制的程序和Delphi編制的程序進行動態數據交換成為了可能。

本文以Borland C++編制的DDE客戶程序為數據源,一旦接收數據正確立即將數據傳送給Delphi編制的DDE服務器程序處理。

1、編寫DDE客戶程序

(1)初始化

客戶程序在使用DDEML函數前必須進行初始化,進行初始化可調用DdeInitialize函數,可如下操作:

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

其中idInst為客戶程序需要保護的此呈現戶的標識符地址,標識符的值由DDEML給出;lpCallBack為回調函數的地址;APPCMDCLIENTONLY指明此程序的性質。

另外創建服務名、話題名及項目名句柄:

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)建立會話

調用DdeConnect建立單個會話:

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

這里idInst是客戶程序在調用DdeInitalize時由DDEML傳遞過來的代表客戶程序的標識符;hszService是服務名字符串的句柄;hszTopic是話題名字符串的句柄。

(3)向服務器傳遞數據

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

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

這里SzData是需傳遞的字符串指針;strlen(szData)+1是數據的大小;hConv是會話名;hszItem是項目名字符串的句柄;XTYPPOKE是調用DdeClientTransaction函數時事務;CFTEXT是數據格式。

(4)會話結束

應用程序結束時需要調用DdeFreeStringHandle函數來釋放所占用的空間,調用DdeDisConnect函數結束會話。

DdeFreeStringHandle(idInst,hszService);

DdeFreeStringHandle(idInst,hszTopic);

DdeFreeStringHandle(idInst,hszItem);

DdeDisconnect(hConv);

2、編寫DDE服務器及數據處理程序

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

四、軟件功能結構

軟件功能結構如圖4所示,程序由通訊程序和數據管理程序構成,其工作步驟如下:

1、由中斷通訊模塊接收智能終端發送的數據放入緩沖區,并發出消息。

2、響應消息對數據進行處理,對智能終端發送數據正確或錯誤標志,并將緩沖區的數據經DDE客戶模塊發送給數據管理程序的DDE服務器模塊。

3、數據管理程序將DDE服務器模塊接收的數據分別給數據庫模塊、動態顯示模塊、報警及打印模塊進行處理。

圖4 軟件功能模塊圖


收藏該商鋪

登錄 后再收藏

提示

您的留言已提交成功!我們將在第一時間回復您~
二維碼 意見反饋
在線留言
主站蜘蛛池模板: 巴林左旗| 剑河县| 南投县| 河间市| 罗甸县| 绥滨县| 汤阴县| 江西省| 栾城县| 中西区| 奎屯市| 应城市| 开封市| 巴楚县| 金乡县| 富川| 灵宝市| 贡嘎县| 阜康市| 修文县| 保德县| 维西| 门头沟区| 肃南| 中阳县| 隆子县| 铁岭市| 绥宁县| 钟祥市| 张家界市| 兴安县| 增城市| 登封市| 平潭县| 阿尔山市| 肥西县| 邵武市| 阳东县| 宜黄县| 兴宁市| 七台河市|