教程-Delphi MSComm 實時串口通訊


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;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM