Delphi 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進制處理的。 |