標籤:
Delphi MSComm 即時串口通訊 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)字元。
4.應用執行個體
下面通過一個執行個體介紹Delphi利用MSComm通訊控制項,開發PC機通過串口對某實驗廠路面荷載進行即時資料採集的編程技術。給出的程式碼具有通用性,並有詳細的注釋,可以直接或稍加改動就可用於其它資料擷取或者即時控製程序中。
該項目上位機採用Delphi編寫,資料擷取儀採用研華ADAM5510作為下位機採集即時壓力資料,採用AscII方式傳送資料,資料轉送速率為9600bps,1位開始位,8位元據位,1位停止位,無同位位元。資料通訊的具體格式為:。
程式用到的全域變數為:
ReceiveStr :String; //接受Ascii碼字元資料字串
F1,F2,F3,F4,Fz,Fa:Double; //四路壓力值資料,總壓力值,平均壓力值
程式中繪製的壓力曲線採用TChart組件,變數定義為:
FChart: TChart;
1).串口初始化
with MSComm do
begin
CommPort:=1; //使用Com1
Settings:=9600,n,8,1; //設定通訊口參數
InputLen:=1; //設定Input一次從接受緩衝區讀取位元組數為1
InBufferCount:=0; //清除接受緩衝區
OutBufferCount:=0; //清除發送緩衝區
InBufferSize:=50; //設定接受緩衝區為50位元組
OutBufferSize:=2; //設定發送緩衝區為2位元組
RThreshold:=1; //設定接受一個位元組產生OnComm事件
InputMode:=ComInputModeText; // 設定接受資料模式為二進位方式
If (not PortOpen )then //判斷通訊口是否開啟
PortOpen:=True
else
ShowMessage(串口已經開啟!);
end;
2).資料接收與處理
為了達到即時資料採集的目的,即時資料採集處理常式採用MSComm的事件驅動方式。
procedure TForm1.MSCommComm(Sender: TObject);
var
buffer :Olevariant;
sTemp:string;
cNow :Char;
tmpX:Double;
begin
i f MSComm.CommEvent = comEvReceive then //接受事件
begin
buffer:=MSComm.Input; //讀取接受到的資料
sTemp:=buffer;
cNow:=sTemp[1];
if((cLast=Chr(13))and(cNow=Chr(10)))then
begin
sF1:=Trim(sF1);
dF1:=StrToFloat(sF1);
with SeriesDepth do //利用TChart繪製深度曲線
begin
tmpX:=XValues[1]-XValues[0];
Delete(0);
AddXY( XValues.Last+tmpX,dF1,,clGed);
end;
sF1:=;
end;
if((cLast<>Chr(13))and(cNow<>Chr(10)))then
begin
sF1:=sF1+cNow;
end;
cLast:=cNow;
end;
end;
3).串口關閉
If (MSComm.PortOpen) then
MSComm.PortOpen:=False;
delphi使用mscomm處理16進位 () 下面這些代碼是針對發送和接收為16進位處理的。 var senddata:array[1..10] of char; reData:array of Variant; sendstr:string; restr:string; i:longint; begin mscomm1.CommPort := 1; //指定連接埠 mscomm1.Settings := ‘9600,N,8,1‘; //其它參數 mscomm1.InBufferSize := 1024; //接收緩衝區 mscomm1.OutBufferSize := 1024; //發送緩衝區 mscomm1.InputMode := comInputModeBinary; //接收模式 mscomm1.InputLen := 0; //一次讀取所有資料 mscomm1.SThreshold := 0; //一次發送所有資料 mscomm1.InBufferCount := 0; //清空讀取緩衝區 mscomm1.OutBufferCount := 0; //清空發送緩衝區 mscomm1.PortOpen:=true; //開啟連接埠 MSComm1.RThreshold := 16; //設定接收多少位元組開產生oncomm事件 senddata[1]:=chr($06); //要發送的資料 senddata[2]:=chr($03); senddata[3]:=chr($00); senddata[4]:=chr($03); senddata[5]:=chr($10); sendstr:=‘‘; for i:=1 to 5 do sendstr:=sendstr + senddata[i]; mscomm1.output:=sendstr; //發送資料 i:=0; bzw:=false;
repeat sleep(10); Application.ProcessMessages; i := i + 1; If i > 30000 Then begin showmessage(‘發送逾時!‘); break; end; Until bzw = true; redata:=mscomm1.Input; 接收資料 restr:=‘‘; for i:=0 to vararrayhighbound(redata,1) do restr:=restr + inttohex(redata[i],2)+‘ ‘; mscomm1.PortOpen:=false; flatmemo1.Text:=restr; end; //oncomm事件 procedure TForm1.MSComm1Comm(Sender: TObject); begin case mscomm1.CommEvent of comEvReceive: bzw := true; end; end; |
[delphi技術]Delphi MSComm 即時串口通訊