在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 呼叫,可以清楚地掌握串列埠通訊的機制,熟悉各種配置和自由靈...