delphi
德爾菲法,也稱專家調(diào)查法,1946 年由美國(guó)蘭德公司創(chuàng)始實(shí)行。該方法是由企業(yè)組成一個(gè)專門的預(yù)測(cè)機(jī)構(gòu),其中包括若干專家和企業(yè)預(yù)測(cè)組織者,按照規(guī)定的程序,背靠背地征詢專家對(duì)未來(lái)市場(chǎng)的意見或者判斷,然后進(jìn)行預(yù)測(cè)的方法。
Delphi串口通訊可以同過(guò)以下幾種方式:
1.windows API函數(shù)。
2.Spocmm組件。
3.PComm庫(kù)函數(shù)。
4.Mscomm控件。
1.windows API函數(shù)。
由于API函數(shù)實(shí)現(xiàn)起來(lái)比較麻繁,這里就不做介紹了,主要介紹其它三種方式 。
第三方組件或控件封裝了API函數(shù),簡(jiǎn)化了編程的難度,并提供詳細(xì)幫助。
2.Spocmm組件。
SPcomm是專為delphi開發(fā)的組件,雖然它也是封裝了windows api,但是我們可以看到它的源代碼。它提供了事件驅(qū)動(dòng)的方式接收數(shù)據(jù),在編程的時(shí)候,我們可以在OnReceiveData函數(shù)中接收到數(shù)據(jù),并做相應(yīng)的處理,
SPcomm組件的主要屬性:
CommName:設(shè)置通訊端口
BaudRate:設(shè)置端口波特率
StartComm:打開串口
StopComm:關(guān)閉串口
WriteCommData:向串口寫數(shù)據(jù)函數(shù)
OnReceiveData:接收數(shù)據(jù)事件
3.PComm庫(kù)函數(shù)。
PComm庫(kù)函數(shù)
PComm 庫(kù)函數(shù)是***MOXA公司提供的,他為用戶提供了基于win32 api的開發(fā)接口。
PComm庫(kù)函數(shù)分為7大類
控制函數(shù)
數(shù)據(jù)輸入函數(shù)
數(shù)據(jù)輸出函數(shù)
狀態(tài)函數(shù)
事件驅(qū)動(dòng)函數(shù)
傳輸文件函數(shù)
特殊設(shè)定函數(shù)
控制函數(shù)主要包括sio_open,sio_close,sio_ioct,sio_flush
sio_open(PortNum) 打開串口
sio_close(PortNum) 關(guān)閉串口
sio_ioct(PortNum, baud, mode)設(shè)置串口的工作模式,包括 波特率,數(shù)據(jù)位,停止位,效驗(yàn)等
sio_flush(portNum,func)清除發(fā)送,接收緩沖區(qū) 其中func 為0清空輸入 ,為1清空輸出,為2清空輸入輸出
數(shù)據(jù)輸入函數(shù)主要包括sio_getch,sio_read
sio_getch(PortNum) 從輸入緩沖區(qū)讀一個(gè)字符
sio_read(PortNum,buf,len)從輸入緩沖區(qū)讀指定個(gè)數(shù)的字符
數(shù)據(jù)輸入函數(shù)主要包括sio_putch sio_write
sio_putch(PortNum) 寫一個(gè)字符到輸出緩沖區(qū)
sio_write(PortNum,buf,len)寫指定個(gè)數(shù)的字符到輸出緩沖區(qū)
狀態(tài)函數(shù)主要包括 sio_lstatus,sio_getbaud,sio_getmode
sio_lstatus(portNum)獲取串口的CTS,DSR,DCD,RI線的狀態(tài)
sio_getbaud(portNum)獲取串口的波特率
sio_getmode(portNum)獲取串口的工作模式。對(duì)應(yīng)sio_ioct函數(shù)
事件函數(shù)主要包括 sio_term_irq,sio_cnt_irq
sio_term_irq(portNum,func,code) 當(dāng)接收到指定字符時(shí)響應(yīng)事件,func為回調(diào)函數(shù)名,code為指定的字符
sio_cnt_irq((PortNum,func,count) 當(dāng)接收到指定個(gè)數(shù)字符時(shí)響應(yīng)事件,func為回調(diào)函數(shù)名,count接收的個(gè)數(shù)
傳輸文件函數(shù)主要包括sio_FtASCIIRx,sio_FtASCIITx
sio_FtASCIITx(portNum,fname,func,key) 發(fā)送一個(gè)文本文件
sio_FtASCIIRx(portNum,fname,func,Key,sec)接收一個(gè)文本文件
由PComm庫(kù)提供的函數(shù)可以看出來(lái)PComm的接口還是挺豐富的。并且MOXA公司為我們提供PComm詳細(xì)的使用說(shuō)明。
4.Mscomm控件。
(1)Mscomm控件是Microsoft公司提供的簡(jiǎn)化Windows下串行通信編程的ActiveX控件,它為應(yīng)用程序提供了通過(guò)串行接口收發(fā)數(shù)據(jù)的簡(jiǎn)便方法。它提供了兩種處理通信的方法:事件驅(qū)動(dòng)方式,查詢方式。
1事件驅(qū)動(dòng)通訊是處理串行端口交互作用的一種非常有效的方法。在許多情況下,在事件發(fā)生時(shí)需要得到通知,例如,在串口接收緩沖區(qū)中接收到字符等,在種情況下,可以利用 MSComm控件的 OnComm 事件捕獲并處理這些通訊事件。OnComm事件還可以檢查和處理通訊錯(cuò)誤。在編程過(guò)程中,就可以在OnComm事件處理函數(shù)中加入自己的處理代碼。這種方法的優(yōu)點(diǎn)是程序響應(yīng)及時(shí),可靠性高。每個(gè)MSComm控件對(duì)應(yīng)著一個(gè)串行端口。如果應(yīng)用程序需要訪問(wèn)多個(gè)串行端口,必須使用多個(gè) MSComm 控件。
2查詢方式實(shí)質(zhì)上還是事件驅(qū)動(dòng)。查詢方式是通過(guò)檢查 CommEvent屬性的值來(lái)查詢事件和錯(cuò)誤,并做相應(yīng)的處理。在有些情況下,這種方式還是顯得挺便捷的。
MSComm控件的常用屬性
CommPort 設(shè)置并返回通訊端口號(hào)。
Settings 以字符串的形式設(shè)置并返回波特率、奇偶校驗(yàn)、數(shù)據(jù)位、停止位。
PortOpen 設(shè)置并返回通訊端口的狀態(tài)。也可以打開和關(guān)閉端口。
Input 從接收緩沖區(qū)返回和刪除字符。
Output 向傳輸緩沖區(qū)寫一個(gè)字符串。
編寫源代碼
//變量說(shuō)明
var
fcomm: TFCOMM;
viewstring:string;
i:integer;
rbuf,sbuf:array[16] of byte;
//打開串口
procedure TFCOMM.FormShow(Sender: TObject);
begin
comm1.StartComm;
end;
//關(guān)閉串口
procedure TFCOMM.FormClose(Sender: TObject; var Action: TCloseAction);
begin
comm1.StopComm;
end;
//自定義發(fā)送數(shù)據(jù)過(guò)程
procedure senddata;
var
i:integer;
commflg:boolean;
begin
viewstring:=‘’ ;
commflg:=true;
for i:=1 to 6 do
begin
if not fcomm.comm1.writecommdata(@sbuf[i],1) then
begin
commflg:=false;
break;
end;
//發(fā)送時(shí)字節(jié)間的延時(shí)
sleep(2);
viewstring:=viewstring+ inttohex(sbuf[i],2)+‘’ ; end;
viewstring:=‘發(fā)送’+ viewstring;
fcomm.memo1.lines.add(viewstring);
fcomm.memo1.lines.add(‘’ );
if not commflg then messagedlg(‘發(fā)送失敗 !’ ,mterror,[mbyes],0);
end;
//發(fā)送按鈕的點(diǎn)擊事件
procedure TFCOMM.Btn_sendClick(Sender: TObject);
begin
sbuf[1]:=byte($ f0); //幀頭
sbuf[2]:=byte($ 01); //命令號(hào)
sbuf[3]:=byte($ ff);
sbuf[4]:=byte($ ff);
sbuf[5]:=byte($ 01);
sbuf[6]:=byte($ f0); //幀尾
senddata;//調(diào)用發(fā)送函數(shù)
end;
//接收過(guò)程
procedure TFCOMM.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;BufferLength: Word);
var
i:integer;
begin
viewstring:=‘’ ;
move(buffer^,pchar(@rbuf^),bufferlength);
for i:=1 to bufferlength do
viewstring:=viewstring+ inttohex(rbuf[i],2)+‘’ ;
viewstring:=‘接收’+ viewstring;
memo1.lines.add(viewstring);
memo1.lines.add(‘’ );
end;
如果 memo1上顯示發(fā)送 F0 01 FF FF 01 F0和接收到 F0 01 FF FF 01 F0,這表示串口已正確地發(fā)送出數(shù)據(jù)并正確地
評(píng)論
查看更多