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