Delphi中串列通訊的實現 作者:阮幫秋

來源:互聯網
上載者:User
Delphi中串列通訊的實現 作者:阮幫秋 發布時間:2001/04/19
 
文章摘要:
  本文就是介紹基於Windows95/NT作業系統用Delphi來實現PC機與下層PLC控制器之間的串口通訊方法。
  關鍵詞 串列通訊,Delphi,多線程

       

本文:  


Delphi中串列通訊的實現


  隨著現代資訊技術的發展以及電腦網路的廣泛使用,電腦通訊技術已經日臻成熟,但串列通訊作為一種靈活方 便可靠的通訊方式,仍不失為有效通訊手段,被廣泛應用於工業控制中。在工業生產實踐中,用PC機對工程實現即時 監控,通常要求PC機能在使用者介面上具有資料擷取、資料處理以及控制訊號的產生與傳輸等功能。在這種特定的環境下,PC機要與過程式控制制的即時訊號相聯絡,就要求能實現對PC機的序列埠直接操作。Borland公司推出的Delphi是一種功能強大的進階程式設計語言,其具有的可視化物件導向的特性,特別適於在Windows環境形介面和使用者程式的編製。

基於WIN95/NT的串列通訊機制

  Windows作業系統的機制禁止應用程式直接存取電腦硬體,但它為程式員提供了一系列的標準API函數,使得應用程式的編製更加方便並且免除了對有關硬體的調試麻煩。在Windows95/NT中,原來Windows3.X的WM_COMMNOTIFY訊息 已被取消,作業系統為每個通訊裝置開闢了使用者可定義大小的讀/寫緩衝區,資料進出通訊口均由作業系統後台完成,應用程式只需對讀/寫緩衝區操作即可。WIN95/NT中幾個常用的串列通訊操作函數如下:

CreatFile開啟串列口
CloseHandle關閉串列口
SetupComm設定通訊緩衝區的大小
ReadFile讀串口操作
WriteFile寫串口操作
SetCommState設定通訊參數
GetCommState擷取預設通訊參數
ClearCommError清除串口錯誤並擷取目前狀態

  除上述幾個函數外,還要經常用到一個重要的記錄DCB(裝置控制塊)。DCB中記錄有可定義的串列口參數,設定串列口參數時必須先用GetCommState函數將系統預設值填入DCB控制塊,然後才可把使用者想改變的自訂值設定。

  在WIN95/NT中進行串列通訊除瞭解基本的通訊操作函數外,還要掌握多線程編程。線程是進程內部執行的路徑,是作業系統分配CPU時間的基底實體。每個進程都由單線程開始完成應用程式的執行。串列通訊需要利用多線程技術實 現,其主要的處理邏輯可以表述如下:進程一開始先由主線程做一些必要的初始化工作,然後主線程根據需要在適當時候建立通訊監視線程監視通訊口,當指定的串列口事件發生時,向主線程發送WM_COMMNOTIFY訊息(由於WIN95取消了WM_COMMNOTIFY訊息,因此必須自己建立),主線程對其進行處理。若不需要WM_COMMNOTIFY訊息,則主線程終止通訊監視線程。

  多線程同時執行,將會引起對共用資源的衝突。為避免衝突,就要用同步多線程對共用資源進行訪問。WIN95提供 許多保持線程同步的方法,筆者採用建立事件對象來保持線程同步。通過CraeteEvent()建立事件對象,使用etEvent()或PulseEvent()函數將事件對象設定成訊號同步。在應用程式中,利用WaitSingleObject()函數等待同步的觸發,等到指定的事件被其它線程設定為有訊號時,才繼續向下執行程式。

Delphi下的具體實現方法

  Delphi的強大功能和支援多線程的物件導向編程技術,使得實現串列通訊非常簡單方便。它通過調用外部的API函數來實現,主要步驟如下:首先,利用CreateFile函數開啟串列口,以確定本應用程式對此串列口的佔有權,並封鎖其它應用程式對此串口的操作;其次,通過GetCommState函數填充裝置控制塊DCB,再通過調用SetCommState函數配置串列口的傳輸速率、資料位元、校正位和停止位。然後,建立串列口監視線程監視串列口事件。在此基礎上就可以在相應的串口上操作資料的傳輸;最後,用CloseHandle函數關閉串列口。具體的程式如下,本程式用Delphi3.0編製在Win95 環境下調試通過,已投入實際應用中,供廣大讀者參考。

程式:
unit comdemou;
interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

const
    Wm_commNotify=Wm_User+12;
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    Procedure comminitialize;
    Procedure MsgcommProcess(Var Message:Tmessage); Message Wm_commnotify;
    { Private declarations }
  public
    { Public declarations }
  end;

  //線程聲明
  TComm=Class(TThread)
  protected
    procedure Execute;override;
  end;

var
  Form1: TForm1;
  hcom,Post_Event:Thandle;
  lpol:Poverlapped;
implementation

{$R *.DFM}

Procedure TComm.Execute; //線程執行過程
var
dwEvtMask:Dword;
Wait:Boolean;
Begin
fillchar(lpol,sizeof(toverlapped),0);
While True do Begin
  dwEvtMask:=0;
  Wait:=WaitCommEvent(hcom,dwevtmask,lpol); //等待串列口事件;
  if Wait Then Begin
    waitforsingleobject(post_event,infinite); //等待同步事件置位;
    resetevent(post_event); //同步事件複位;
    PostMessage(Form1.Handle,WM_COMMNOTIFY,0,0);//發送訊息;
    end;
  end;
end;

procedure Tform1.comminitialize; //串列口初始化
var
lpdcb:Tdcb;
Begin
hcom:=createfile('com2',generic_read or generic_write,0,nil,open_existing,
            file_attribute_normal or file_flag_overlapped,0);//開啟串列口
  if hcom=invalid_handle_value then
  else
    setupcomm(hcom,4096,4096); //設定輸入,輸出緩衝區皆為4096位元組
    getcommstate(hcom,lpdcb); //擷取串列口當前預設設定
    lpdcb.baudrate:=2400;
    lpdcb.StopBits:=1;
    lpdcb.ByteSize:=8;
    lpdcb.Parity:=EvenParity; //偶校正
    Setcommstate(hcom,lpdcb);
    setcommMask(hcom,ev_rxchar);
    //指定串列口事件為接收到字元;
end;

Procedure TForm1.MsgcommProcess(Var Message:Tmessage);
var
Clear:Boolean;
Coms:Tcomstat;
cbNum,ReadNumber,lpErrors:Integer;
Read_Buffer:array[1..100]of char;
Begin
Clear:=Clearcommerror(hcom,lpErrors,@Coms);
if Clear Then Begin
  cbNum:=Coms.cbInQue;
  ReadFile(hCom,Read_Buffer,cbNum,ReadNumber,lpol);
  //處理接收資料
  SetEvent(Post_Event); //同步事件置位
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
comminitialize;
post_event:=CreateEvent(nil,true,true,nil); //建立同步事件;
Tcomm.Create(False); //建立串列口監視線程;
end;

end.

作者會員名:ruan_bangqiu

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.