應為工作需要自己編寫的rs232通訊模組,該模組已經編寫了蠻久,在實際使用中可能有沒有考慮和不完善的地方。
//如果使用該模組請保留該注釋,如果被修改或編輯請將修改後的**傳送乙份給我
//編寫:戴琪英
//e_mail:[email protected]
//2000-09-01
unit r232comm;
inte***ce
uses
windows,sysutils;
const
initr12comm_success=0;
initr12comm_failure=-1;
varbsendfinish:boolean=true;//傳送完標誌
irecvlen:dword=0;
recvbuff,tempbuff:pchar;
sendcommand,recvcommand:string;//傳送和接收到的命令
recvfinish:bool=false;
recvbuffinit:bool=false;
sendcommandsuccess:bool; //切換臺命令被成功傳送標誌
function initr12commdev(comno:pchar):string; //初始化切換臺串列埠,返回狀態字元
procedure switchr12(writebuffer:pchar);//對切換臺進行切換函式
procedure switchr12byte(writebuffer:byte);
procedure commsendnotify;//串列埠接收到字元事件響應過程
procedure commrecvnotify; //串列埠傳送緩衝區空事件響應過程
procedure commwatchthread(var lpdwparam:dword);//通訊口監視執行緒
function coninfo :string;
//以下對串列埠進行配置
dcb.dcblength:=sizeof(_dcb);
comstate:=getcommstate(hcommdev,dcb); //得到預設設定
if comstate=false then
initr12commdev:='切換臺通訊埠初始化失敗.'
else
initr12commdev:='切換臺通訊埠初始化成功.';
dcb.baudrate:=9600; //波特率 9600
dcb.bytesize:=8;//7; //資料長度7位
dcb.parity:=noparity;//oddparity; //校驗方式 奇校驗
dcb.stopbits:=onestopbit; //停止位 1 位
dcb.flags := 0; // enable fbinary
dcb.flags := dcb.flags or 2; // enable parity check
dcb.xonchar:= chr($00) ;
dcb.xoffchar:= chr($00) ;
dcb.xonlim:= 100 ;
dcb.xofflim:= 100 ;
dcb.evtchar := char($ff);
comstate:=setcommstate(hcommdev,dcb); //設定串列埠
if comstate=false then
initr12commdev:='切換臺通訊埠初始化失敗.'
else
initr12commdev:='切換臺通訊埠初始化成功.';
//設定通訊接收到字元事件控制代碼
postrecvevent:=createevent(nil,
true,//手工重置事件
true, //初始化為有訊號狀態
nil);
//設定讀非同步i/o操作事件控制代碼
read_os.hevent:=createevent(nil,
true,//手工重置事件
false, //初始化為無訊號狀態
nil);
//設定傳送緩衝區空事件控制代碼
postsendevent:=createevent(nil,
true,//手工重置事件
true, //初始化為有訊號狀態
nil);
//設定寫非同步i/o操作事件控制代碼
write_os.hevent:=createevent(nil,
true,//手工重置事件
false,//初始化為無訊號狀態
nil);
//建立通訊監視執行緒
comthreadhwnd:=createthread(nil,
0,@commwatchthread, //通訊線程函式的位址
nil,
0, //建立後立即執行
dwthreadid1);//通訊線程id號
if comthreadhwnd=invalid_handle_value then
initr12commdev:='initr12comm_failure'
else
initr12commdev:='切換臺通訊埠初始化成功.';
end;
///切換臺切換控制函式
///輸入引數;切換命令字串
procedure switchr12(writebuffer:pchar);
vardwwritebyte,txcount:dword;
bl:bool;
dwerror:dword;
procedure switchr12byte(writebuffer:byte);
vardwwritebyte,txcount:dword;
bl:bool;
dwerror:dword;
begin
os.hevent:=createevent(nil,
true,
false,
nil);
//傳送緩衝區空處理過程
procedure commsendnotify;
begin
setevent(postsendevent);//置傳送事件未有訊號狀態,以便進行下一次傳送
end;
///接收到字元處理函式
procedure commrecvnotify;
varrxcount,dwreadbyte:dword;
indata :byte;
begin
clearcommerror(hcommdev,dwerrorflag,@comstat);
rxcount:=comstat.cbinque; //獲取接收緩衝區的字元個數
if rxcount>0 then
begin
if not recvbuffinit then
begin
strcopy(recvbuff,'');
recvbuffinit:=true;
end;
strcopy(tempbuff,'');
readfile(hcommdev,byte(tempbuff^),rxcount,dwreadbyte,@read_os);//讀字元存入
//臨時緩衝區中
irecvlen:=irecvlen+dwreadbyte; //接收到字元個數統計
if irecvlen >=1 then
begin
indata := byte(tempbuff^);
if indata = $d9 then
begin
sendcommandsuccess:=true; //如果狀態一致,則置該標誌為真,標誌切換成功
endelse
begin
sendcommandsuccess:=false;//否則,置該標誌為假,表示切換失敗
end;
irecvlen:=0;
strcopy(recvbuff,'');
recvbuffinit:=false;
purgecomm(hcommdev,purge_rxclear ); //清空接收緩衝區
endend;
setevent(postrecvevent); //置接收事件控制代碼為有訊號狀態,以便接收新字元
end;
function coninfo :string;
begin
if sendcommandsuccess =true then
begin
result := '切換器聯機監測成功!';
endelse
begin
result := '切換器聯機監測失敗!';
end;
end;
initialization
recvbuff:=stralloc(50*sizeof(char));
tempbuff:=stralloc(50*sizeof(char));
finalization
strdispose(recvbuff);
strdispose(tempbuff);
closehandle(postrecvevent);
closehandle(read_os.hevent);
closehandle(postsendevent);
closehandle(write_os.hevent);
end.
RS232串列埠通訊詳解
rs232串列埠通訊詳解 引腳定義,電氣特性,傳輸格式,接收過程,微控制器晶振,rs485,rs422 轉 2010 03 13 15 47 串列埠是計算機上一種非常通用的裝置通訊協議。串列埠的引腳定義 9芯訊號方向來自 縮寫描述 1數據機 cd載波檢測 2數據機 rxd接收資料3pc txd傳送資...
RS232串列埠通訊詳解
rs232串列埠通訊詳解 串列埠是計算機上一種非常通用的裝置通訊協議。串列埠的引腳定義 9芯 訊號方向來自 縮寫 描述 1 數據機 cd 載波檢測 2 數據機 rxd 接收資料 3 pc txd 傳送資料 4 pc dtr 資料終端準備好 5 gnd 訊號地 6 數據機 dsr 通訊裝置準備好 7 ...
RS232串列埠通訊詳解
串列埠是計算機上一種非常通用的裝置通訊協議。兩個串列埠連線時,接收資料針腳與傳送資料針腳相連,彼此交叉,訊號地對應相接即可。rs 232介面 通常適合於資料傳輸頻率在0 20000bps範圍的通訊。是點對點的通訊方式,在pc機上通常都是com串列埠。不足 抗干擾能力差,通訊距離短,速率低。rs 42...