在WIN32中的串列埠通訊(Delphi)

2021-05-22 01:51:17 字數 3959 閱讀 7090

在win32中的串列埠通訊(delphi) 

由在win32作業系統中禁止應用程式象dos中那樣直接訪問計算機硬體,因此,無法象以前那樣採用中斷讀寫串列埠。但是在win32中我們可發採用兩種方法訪問串列埠:1、使用vb中的mscomm串列埠控制項;2、採用api函式,本文主要介紹採用api函式實現串列埠通訊。 

由於wm_commnotify訊息已被取消,故本文自定義了wm_commnotify訊息,在win32中幾個常用的串列埠通訊api函式如下: 

createfile     開啟串列埠 

closehandle   關閉控制代碼,用於釋放記憶體 

setcomm      設定緩衝區大小 

readfile      讀串列埠 

writefile      寫串列埠 

setcommstate   設定通訊引數 

getcommstate   獲取通訊引數 

clearcommerror 清除串列埠錯誤並獲取讀、寫緩衝區當前位元組數 

setcommmask 設定串列埠遮蔽事件 

purgecomm   消除串列埠讀寫緩衝區的所有字元,用以終止懸而未決的讀寫操作。 

postmessage 傳送訊息 

waitcommevent 等待串列埠事件發生 

由於採用多執行緒操作串列埠,還用到以下api函式 

delphi的強大和多執行緒支援,使得實現串列埠通訊非常方便簡單,首先,用createfile開啟串列埠,其次,通過getcommstate獲取串列埠引數,並用setcommstate設定串列埠引數,然後建立執行緒用以監視串列埠,此後就可以進行串列埠通訊了,最後用closehandle 釋放所有資源(切記,以免宕機)。 

在這其中,使用到乙個重要的結構dcb ,其常用的一些定義如下: 

baudrate:波特率,可直接設為110、300、600、1200、2400、4800、9600、19200等值。 

bytebits:資料位長度,可高為4-8。 

parity:奇偶校驗方式,0-4分別為無、偶、奇、空 

stopbits:停止位長度,0,1,2分別為1、1.5、2位 

其餘詳細說明請參考win32.hlp、msdn、以及delphi5/source/rtl/win/windows.pas。 

具體程式見如下,本程式用delphi 5.0編制,在windows98編譯通過,並兩台pc上可穩定執行,源程式絕對完整無刪節,絕不象某人所說的可以執行卻無傳送部分,且無法接收資料。 

unit unit1; 

inte***ce 

uses 

windows, messages, sysutils, classes, graphics, controls, forms, dialogs, 

stdctrls; 

const 

wm_commnotify=wm_user+12; 

type 

tform1 = class(tform) 

memo1: tmemo; 

button1: tbutton; 

procedure button1click(sender: tobject); 

procedure formdestroy(sender: tobject); 

procedure formcreate(sender: tobject); 

private 

procedure comminitialize; 

procedure msgcomm(var msg:tmessage); message wm_commnotify; 

function   writestr(const str:string):boolean; 

public 

end; 

tcomm=class(tthread) 

protected 

procedure execute;override; 

end; 

procedure tform1.msgcomm(var msg:tmessage);       //接收資料 

var 

clear:boolean; 

coms:tcomstat; 

cbnum,cbread,lperrors:dword; 

s:string; 

begin 

clear:=clearcommerror(hcom,lperrors,@coms); 

if clear then 

begin 

cbnum:=coms.cbinque;     //獲取接收緩衝區待接收位元組數 

setlength(s,cbnum+1);      //分配記憶體 

readfile(hcom,pchar(s)^,cbnum,cbread,lpolr);    //讀串列埠 

setlength(s,cbread);       //分配 

setevent(post_event);      //同步事件置位 

memo1.lines.add(s); 

end; 

end; 

procedure tform1.button1click(sender: tobject);   //傳送hex碼eb90eb90 

var 

s_data:string; 

begin 

s_data:=chr($eb)+chr($90)+chr($eb)+chr($90); 

if   not writestr(s_data) then   showmessage('無法傳送資料') 

else showmessage('傳送成功'); 

end; 

procedure tform1.formdestroy(sender: tobject);    //釋放記憶體 

begin 

closehandle(lpolw^.hevent); 

closehandle(lpolr^.hevent); 

dispose(lpolw); 

dispose(lpolr); 

lpolw:=nil; 

lpolr:=nil; 

rxcomm.terminate; 

setevent(post_event); 

closehandle(post_event); 

closehandle(hcom); 

end; 

procedure tform1.formcreate(sender: tobject);     //初始化記憶體及串列埠 

begin 

comminitialize; 

new(lpolw); 

new(lpolr); 

lpolw^.internal:=0; 

lpolw^.internalhigh:=0; 

lpolw^.offset:=0; 

lpolw^.offsethigh:=0; 

lpolw^.hevent:=createevent(nil,true,false,nil); 

lpolr^.internal:=0; 

lpolr^.internalhigh:=0; 

lpolr^.offset:=0; 

lpolr^.offsethigh:=0; 

lpolr^.hevent:=createevent(nil,true,false,nil); 

purgecomm(hcom,purge_txabort or purge_rxabort or purge_txclear or purge_rxclear); 

post_event:=createevent(nil,true,true,nil); 

rxcomm:=tcomm.create(false); 

end; 

end. 

Win32中簡單實現串列埠通訊

宣告 本文的串列埠通訊是主機向從機傳送資料。step 1 handle m hcomm createfile com3 串列埠名,根據實際情況而定 generic read generic write,0,null,open existing,0 if invalid handle value m ...

win32 串列埠 通訊 非同步 執行緒方式

該例子是 visual c 實踐與提高 串列埠通訊與工程應用篇 第2版 書上給出的部分原始碼,整理修改之後的演示 借助 tc35模組可以,正常執行 如下 seritaltk.cpp 定義控制台應用程式的入口點。include stdafx.h include handle hcom dword th...

Win32串列埠程式設計

win32串列埠程式設計 金貝貝 一 基本知識 win32下串列埠通訊與16位串列埠通訊有很大的區別。在win32下,可以使用兩種程式設計方式實現串列埠通訊,其一是呼叫的windows的api函式,其二是使用activex控制項。使用api 呼叫,可以清楚地掌握串列埠通訊的機制,熟悉各種配置和自由靈...