熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Delphi編程 >> 正文

Delphi實現遠程串口的數據采集[1]

2013-11-23 17:42:17  來源: Delphi編程 
    摘要本文介紹了在Windows平台下串口開發的方法並給出一個使用Delphi設計的遠程數據采集的實例

   引言

  在工業生產實踐中使用PC機對Inprise公司推出的Delphi是一種功能強大的高級編程語言其具有可視化面向對象的特征特別適合Windows平台下的圖形界面和用戶程序的編制本文就介紹在Windows平台下用Delphi開發串口的方法和使用Delphi設計的一個實現遠程串行數據采集的實例

   串口工作原理及軟件實現方法

  串口進行通信的方式有兩種同步通信方式和異步通信方式同步通信方式要求通信雙方以相同的時鐘頻率進行而且准確協調通過共享一個單個時鐘或定時脈沖源保證發送方和接收方的准確同步效率較高異步通信方式不要求雙方同步收發方可采用各自的時鐘源雙方遵循異步的通信協議以字符為數據傳輸單位發送方傳送字符的時間間隔不確定發送效率比同步傳送效率低

  在Windows平台下Win API支持同步和異步兩種I/O操作同步操作的方式的程序設計相對比較簡單但是I/O操作函數在I/O操作結束前不能返回這將掛起調用線程直到I/O操作結束異步操作方式要相對復雜一些但是可以讓I/O操作在後台運行而不會掛起調用線程這在大數據量通信情況下對改善調用線程的響應速度是相當有效的同時由於Winx和WinNT下對串行通信的處理不同這就導致了在Winx下開發的同步方式串行通信程序在NT下會發生工作線程之間的協作阻塞即當讀線程在等待WaitCommEvent的時候寫線程不能正常工作停在那裡整個程序處於癱瘓狀態這個問題是Windows的API函數處理串行通信的一個BUG所以對於適應性強的程序都是選擇異步方式下面本文對在Windows平台下對串口進行開發的方法進行介紹

  . 匯編程序直接讀寫串口

  匯編語言的編譯效率和執行效率都很高使用匯編語言直接對串口進行操作可以部分彌補串行通信速度較慢的缺陷具體做法是用匯編語言編寫讀寫串口的函數在通信程序中直接調用或者在Delphi中直接內嵌匯編程序進行對端口的讀寫

  例如


asm
  mov dxh
  mov axeh
  int h
end;


  這樣可以達到直接讀到端口的效果但是在WinNT和Win系統使用了保護機制不允許用戶態的程序直接讀取端口所以在WinNT和Win這種方法不能被允許執行Ring的用戶態的程序要進入Ring去讀寫端口必須先提供一個驅動(sys)程序然後通過DLL導出函數供用戶程序調用顯然這種方法比較不容易實現

  . 使用API函數進行串口編程

  Windows系統通信一般都以WOSA(Windows Open Service Architecture即Windows開放式服務體系)模型為基礎在此模型中位於上層的應用程序通過調用各種通信API(Application Programming Interfaces即應用程序接口)與位於下層的設備驅動程序進行數據交換

  在Windows平台下Windows將設備看作是文件進行管理對設備的操作也可以看作是對文件的操作Win API提供了CreateFile()WriteFile()ReadFile()WaitForSingleObject()WaitForMultipleObjects()CreateEvent()CreateMutex()CreateSemaphore()CreateThread()等函數其基本步驟如下

  () 利用CreateFile()函數打開串口該函數有七個參數其中dwCreationDistribution參數取OPEN_EXISTING表明打開的串口對應於實際的物理串口lpFileName參數是要打開的串口名稱COMDwFlagsAndAttributes參數決定對串口的操作是同步操作還是異步操作DwDesiredAccess參數是訪問方式可取GENERIC_READ或GENERIC_WRITEDwShareMode參數是共享模式對串口物理設備必須取LpSecurityAttributes參數是安全屬性取值為NULLDwFlagsAndAttributes是文件屬性和標識一般取值為FILE_ATTRIBUTE_NORMAL該函數返回串口操作的句柄

  () 對該串口句柄對應的設備進行配置如波特率數據位停止位是否奇偶校驗等這部分首先使用GetCommState()函數得到當前的串口配置信息將這些信息存放在一個DCB結構中然後對該DCB結構裡面的內容進行重新按要求設置最後調用SetCommState()函數使修改的設置生效

  () 配置串口事件SetCommMask()函數可以設置多個串口信息事件其串口的信息事件可以是以下任意的組合


EV_BREAK在輸入時Windows檢測到中斷
EV_CTS CTS信號改變狀態
EV_DSR DSR信號改變狀態
EV_ERR 發生線狀態錯誤
EV_RING 檢測到振鈴指示
EV_RLSD 接收線信號探測狀態發生改變
EV_RXCHAR接收緩沖區裡收到字符EV_RXFLAG收到事件字符並放入接收緩沖區
EV_TXEMPTY輸出緩沖區空


    () 創建串口監視線程監視串口事件首先使用WaitForSingleObject()WaitForCommEvent()WaitForMultipleObjects()等等待函數對線程進行控制當沒有數據收發時將線程阻塞減少其CPU的資源占用當有數據收發時線程自動啟動完成數據的收發最後調用CreateThread()函數啟動線程

  () 串口使用結束用CloseHandle()函數關閉串口回收資源

  由此可見利用Win API函數編寫串口通信程序比較復雜需要掌握大量的系統和通信知識其優點是實現的功能強大應用面廣泛適合編寫較為復雜的地層次應用程序

[]  []  


From:http://tw.wingwit.com/Article/program/Delphi/201311/24926.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.