delphicom編程
『壹』 請問 DELPHI串口通訊編程 的基本思路是什麼
用Delphi開發串口通信軟體一般有兩種方法:一是利用Windows的通信API函數,另一種是採用Microsoft的MSComm控制項。利用 API編寫串口通信程序較為復雜,需要掌握大量通信知識,其優點是可實現的功能更強大,應用面更廣泛,更適合於編寫較為復雜的低層次通信程序。而利用 MSComm控制項則相對較簡單,該控制項具有豐富的與串口通信密切相關的屬性及事件,提供了對串口的各種操作。
一、MSComm控制項的主要屬性及事件
(1)CommPort:設置或返回串列埠號,預設為1。
(2)Setting:設置或返回串口通信參數,格式為「波特率,奇偶校驗位,數據位,停止位」。例如:MSComm1.Setting:='9600,n,8,1'
(3)PortOpen:打開或關閉串列埠,格式為:MSComm1.PortOpen:={True|False}
(4)InBufferSize:設置或返回接收緩沖區的大小,預設值為1024位元組。
(5)InBufferCount:返回接收緩沖區內等待讀取的位元組數,可通過設置該屬性為0來清空接收緩沖區。
(6)RThreshold:該屬性為一閥值,它確定當接收緩沖區內的位元組個數達到或超過該值後就產生代碼為ComEvReceive的OnComm事件。
(7)SThreshold:該屬性為一閥值,它確定當發送緩沖區內的位元組個數少於該值後就產生代碼為ComEvSend的OnComm事件。
(8)InputLen:設置或返回接收緩沖區內用Input讀入的位元組數,設置該屬性為0表示Input讀取整個緩沖區的內容。
(9)Input:從接收緩沖區讀取一串字元。
(10)OutBufferSize:設置或返回發送緩沖區的大小,預設值為512位元組。
(11)OutBufferCount:返回發送緩沖區內等待發送的位元組數,可通過設置該屬性為0來清空緩沖區。
(12)OutPut:向發送緩沖區傳送一串字元。
如果在通信過程中發生錯誤或事件,就會引發OnComm事件,並由CommEvent屬性代碼反映錯誤類型,在通信程序的設計中可根據該屬性值來執行不同的操作。CommEvent屬性值及其含義如下:
(1)ComEvSend:值為1,發送緩沖區的內容少於SThreshold指定的值。
(2)ComEvReceive:值為2,接收緩沖區內字元數達到RThreshold指定的值。
(3)ComEvFrame:值為1004,硬體檢測到幀錯誤。
(4)ComEvRxOver:值為1008,接收緩沖區溢出。
(5)ComEvTxFull:值為1010,發送緩沖區溢出。
(6)ComEvRxParity:值為1009,奇偶校驗錯誤。
(7)ComEvEOF:值為7,接收數據中出現文件尾(ASCII碼為26)字元。
二、程序樣例
在Delphi3.0中無法使用MSComm控制項,筆者使用的是Delphi5.0。MSComm控制項是VB中的OCX控制項,首先需要將其添加到 Delphi中,選擇菜單「Component」→「Import ActiveX Control」,在「Import ActiveX」頁內選擇「Microsoft Comm Control」,點擊「Install」安裝,安裝後在「ActiveX」組件板中出現MSComm圖標,即可被使用。有一點要注意,在Object Inspector中MSComm控制項的Input和Output屬性是不可見的,但它們仍然存在,這兩個屬性的類型是OleVariant(Ole萬能變數)。
下面是一接收程序的樣例(主要部分),大家可根據實際需要進行完善。
在Form中放置一Memo控制項用於顯示接收的數據,Combobox1選擇通信參數(Setting屬性值),Combobox2選擇串口(CommPort屬性值),按Button1開始接收數據,按Button2停止接收。
procere TForm1.FormCreate(Sender: TObject);
begin
Mscomm1.InBufferCount :=0; // 清空接收緩沖區
Mscomm1.InputLen :=0; // Input讀取整個緩沖區內容
Mscomm1.RThreshold :=1; // 每次接收到字元即產生OnComm事件
end;
procere TForm1.Button1Click(Sender: TObject);
begin
Mscomm1.Settings :=ComboBox1.Text;
if ComboBox2.Text ='com1' then // 假設只考慮com1和com2兩種情況
Mscomm1.CommPort :=1
else
Mscomm1.CommPort :=2;
Mscomm1.PortOpen :=true; // 打開串口
Mscomm1.DTREnable :=true; // 數據終端准備好
Mscomm1.RTSEnable :=true; // 請求發送
end;
procere TForm1.Button2Click(Sender: TObject);
begin
Mscomm1.PortOpen :=false; // 關閉串口
Mscomm1.DTREnable :=false;
Mscomm1.RTSEnable :=false;
end;
procere TForm1.MSComm1Comm(Sender: TObject);
var
recstr:Olevariant;
begin
if Mscomm1.CommEvent = 2 then
begin
recstr := Mscomm1.Input ;
Memo1.text := Memo1.Text + recstr;
end;
end;
『貳』 Delphi 7:操作串口(ComPort)
串列介面 ( Serial Interface ),簡稱 串口 ,即 COM介面 ( cluster communication port , 串列通訊埠 ),是採用串列通訊方式的擴展介面。
一條信息的各位數據被 逐位按順序傳送 的通訊方式稱為 串列通訊 。
串口的出現 是在1980年前後,初期一般用來連接滑鼠和外置 Modem 以及老式攝像頭和寫字板等設備,它也可以應用於兩台計算機(或設備)之間的互聯及數據傳輸。
串口的特點 是通信線路簡單,只要一對傳輸線就可以實現雙向通信,從而大大降低了成本,特別適用於遠距離通信,但傳送速率較慢,115kbps~230kbps。
由於串口不支持熱插拔及傳輸速率較低,部分新主板和大部分便攜電腦已取消該介面,目前多用於工控和測量設備以及部分通信設備中。
USB , Universal Serial Bus 通用串列匯流排 ,是一個外部匯流排標准,誕生於1996年之後,用於規范電腦與外部設備的連接和通訊,是應用在PC領域的介面技術。
USB設備有以下優點:
相較於USB,串口已經是一種古老的技術了,而且PC上已經很少見到串口了,但為什麼有了USB還要用串口呢?
一般而言,一個串口只能被一個軟體佔用,其他軟體就用不了這個串口了。
使用這個虛擬串口軟體生成的COM1、COM2,默認是相互連接的,從COM1發送數據,可以從COM2接收到;從COM2發送數據,可以從COM1接收到。我們可以通過這樣的方式,來測試自己所寫的軟體。
Delphi 7 操作串口,我這里引用了第三方控制項 ComPort: uses CPort
我這里是將兩個exe文件,分別運行了。
『叄』 DELPHI編程
1.類似於vb.中的doevents功能。
大家或許發現,在Delphi中沒有類似於vb.中的doevents函數,這樣有的時候,我們將無法使Windows響應多個同時發生的事件。其實,在Delphi的application對象中包括類似的一個方法:ProcessMessage,你可以通過調用Application.ProcessMessage來完成象vb.中的doevents一樣的功能。
2.在Delphi中調用NetscapeNavigator。
隨著Internet的火爆,有沒有想過在你的Delphi程序中啟動Netscape瀏覽器,顯示出你指定的WWW地址的主頁。下面這個程序能夠完成這一功能。
programNetscape;
usesDDEMan;
procereGotoURL(sURL:string);
var
dde:TDDEClientConv;
begin
dde:=TDDEClientConv.Create(nil);
withddedo
begin
//specifythelocationofnetscape.exe
ServiceApplication:=′c:\ns32\program\netscape.exe′;
//activatetheNetscapeNavigator
SetLink(′Netscape′,′WWW—Activate′);
RequestData(′0xFFFFFFFF′);
//gotothespecifiedURL
SetLink(′Netscape′,′WWW—OpenURL′);
RequestData(sURL+′,,0xFFFFFFFF,0x3,,,′);
CloseLink;
end;
dde.Free;
end;
begin
GotoURL(′http://www.yahoo.com/′);
end.
3.格式化整數輸出。
比較大的數字在輸出時會顯得不易閱讀,在Delphi中顯示帶分節號的數字是相當簡單的一件事,如下即可:xxxxx.caption:ΚFormatFloat(′#′,524667500)。
4.在編譯時獲得提示。
在Delphi2.0中,編譯時,可以讓編譯器告訴你一些提示,比如哪些變數聲明了,卻從來沒有使用過。我們知道,可以通過菜單中的選項來控制是否要Delphi這樣做,但如果由於一些特殊需要,你只要在指定的代碼段需要Delphi這樣的提示,怎麼辦呢?請參考如下的程序。
{$HINTON}
procereTform1.Button1Click(Sender:TObject);
var
X:integer;
begin
end;
{$HINTOFF}
5.更改Windows95的牆紙。
在Delphi中你可以很方便地更改牆紙,請參考以下的程序。
procereChangeIt;
var
Reg:TregIniFile;
begin
Reg:ΚTRegIniFile.Create(′ControlPanel′)
;
Reg.WriteString(′desktop′,′Wallpaper′,
′c:\pwin95\forest.bmp′);
Reg.WriteString(′desktop′,′TileWallpaper
′,′1′);
Reg.Free;
SystemParametersInfo(SPI—SETDESKWALLPAPER,0
,nil,SPIF—SENDWININICHANGE);
end;
6.獲得最後使用文件的日期。
在Win95中有一項新的功能,就是可以獲得訪問文件的最後日期。著名的CleanSweapforWin95軟體中就是靠這一功能來作為判斷某個文件是否被經常訪問的依據之一。在Delphi中,我們可以通過下面的程序來達到此功能。
functionGetFileLastAccessTime(sFileName:string):TDateTime;
var
ffd:TWin32FindData;
dft:DWord;
lft:TFileTime;
h:THandle;
begin
//getfileinformation
h:ΚWindows.FindFirstFile(PChar(sFileName),ffd);
if(INVALID—HANDLE—VALUEΙΛh)then
begin
//we′relookingforjustonefile,socloseour″find″
Windows.FindClose(h);
//
FileTimeToLocalFileTime(ffd.ftLastAccessTime,lft);
//convertFILETIMEtoDOStime
FileTimeToDosDateTime(lft,LongRec(dft).Hi,LongRec(dft).Lo);
//finally,′snativedate/timefunctions
Result:ΚFileDateToDateTime(dft);
end;
end;
GetFileLastAccessTime()將會以Delphi的TdateTime格式返回你所指定的文件的最後訪問日期。