當前位置:編程學習大全網 - 源碼下載 - 請問用DELPHI的MSComm控件怎麽編寫串口的程序啊?我是菜鳥 請給個詳細的例子 從添加控件開始 詳細些 謝謝

請問用DELPHI的MSComm控件怎麽編寫串口的程序啊?我是菜鳥 請給個詳細的例子 從添加控件開始 詳細些 謝謝

1、 mscomm控件安裝。

Mscomm控件默認存在於delphi的ActiveX面板上,如果不存在,需要先導入該控件,步驟 :通過菜單 component---Import Activex component 打開Import Acitvex對話框。如下圖:

如果列表中找不到該Microsoft Comm Control,那麽點Add按鈕找到Mscomm32.ocx,最後點Install..即可。

2、 需要了解的屬性:

需要了解的幾個屬性:

CommPort:設置通信端口號,用該串口與外界通信。

Setting:以字符串的形式設置數據傳輸速率、奇偶校驗、數據比特、停止比特;

PortOpen:設置並返回通信端口的狀態,用來可以打開和關閉端口;

Input:從接收緩沖區返回和刪除字符;

Output:向傳輸緩沖區定壹個字符串)

RThreshold:設置接收幾個字符觸發控件響應函數。

CTSHolding:該屬性確定是否可通過查詢CTS線的狀態發送數據。CTS是調制解調器發送到相連計算機的信號,指示傳輸可以進行。該屬性在設計時無效,在運行時為只讀。

如果CTS線為低電平(CTSHolding = FALSE)並且超時時,MSComm控件設置CommEvent屬性為comEventCTSTO(Clear To Send Timeout)並產生OnComm事伯。CTS線用於RTS/CTS硬件握手。如果需要確定CTS線的狀態,CTSHolding屬性給出壹種手工查詢方法。

SThreshold:設置發送緩沖區中有幾個字符時候觸發oncomm

InputMode:用於設置或者返回傳輸數據的類型。

ComInputModeText(缺省) 0 通過Input屬性以文本方式取回數據

ComInputModeBinary 1 通過Input屬性以二進制方式取回數據

InputLen:該屬性用於設置並返回Input屬性從接收緩沖區讀取的字符數。

InBuffersize:設置輸入緩沖區的大小,默認值為1024字節。

InBufferCount: InBufferCount屬性用於返回輸入緩沖區內的等待讀取的字節個數,可以通過該屬性值為0來清除接收緩沖區。

Output:void SetOutput(const VARIANT & newValue);

Output屬性用於向發送緩沖區寫數據流。註意:Output屬性可以發送文本數據或二進制數據。傳輸文本數據時,應該將字符型 數據放入VARIANT變量中;傳輸二進制數據(即按字節傳送)時,應將字節型數據放入VARIANT型變量中。如果通常給應用程序發送ANSI字符串,可以以文本方式發送。如果數據包含了內嵌控制字符、NULL字符等,必須將其作為二進制傳遞過去。

DTREnable:確定在通信時是否使用DTR線有效,DTR是計算機發送到調制解調器的信號,表明計算機在等待數據傳輸。

RTSEnable:確定是否使用RTS線有效。壹般情況下,由計算機發送RTS信號到連接的調制解調器,請求允許發送數據。

EOFEnable:確定在輸入過程中MSComm控件是否尋找文件結尾(EOF)字符。如果找到EOF字符,將停止輸入並激活OnComm事件,此時CommEvent屬性設置為comEvEOF,這裏bNewValue為布爾表達式,確定當找到EOF字符時,OnComm事件是否被激活。當bNewValue的設置值TRUE時,EOF字符找到時OnComm事件被激活。否則當VALUE值設為FALSE(默認)時,EOF字符找到時OnComm事件不被激活。

註意:當EOFEnable屬性設置為FALSE時,OnComm控件將不在輸入流中尋找EOF字符。

CDHolding:通過查詢CD線的狀態確定當前是否有傳輸。CD是從調制解調器發送到相連計算機的壹個信號,指示調制解調器正在聯機。該屬性在設計時無效,在運行時為只讀。屬性的設置值為:當bNewValue為TRUE時,CD線為高電平;當bNewValue為FALSE時,CD線為低電平。註意當CD線為高電平(CDHolding=TRUE)且超時時,MSComm控件設置CommEvent屬性為comEventCDTO(CD超時錯誤),並產生OnComm事件。

註意:在主機應用程序中捕獲壹個丟失的傳輸是特別重要的,例如壹個公告板,因為呼叫者可以隨時掛起(放棄傳輸)。CD也被稱為Receive Line Signal Detect(RLSD)。

DSRHolding:確定DSR線的狀態。DSR信號由調制解調器發送到相連計算機,指示作好操作準備。該屬性在設計時無效,在運行時為只讀。DSRHolding屬性返回為TRUE時,表示DSR線高,返回FALSE時,表示DSR線低。當DSR線為高電平時(DSRHolding=TRUE)超時時,MSComm控件設置CommEvent屬性為comEventDSRTO(數據準備超時)並產生OnComm事件。當為DTE(Data Terminal Equipment)機器寫DSR/DTR握手例程時該屬性是分有用的。

3、 控件安裝後,在AcitveX面板上可以看到壹個電話機樣式的圖標,把它拖到delphi工程窗體上設置屬性後就可以使用了

打開串口: mscomm1.portopen:=true;

關閉串口: mscomm1.portopen:=false;

處理接收的數據,在oncomm事件中,下面給出點提示例子(只是壹個函數,缺乏樁函數不能運行,只是用來說明使用)

procedure TF_Com.MSCommComm(Sender: TObject);

var

i,j,itemp:integer;

pcurDeviceSer:pdevicepro;

begin

if mscomm.CommEvent = 2 then

begin

inBuf:=F_Com.MSComm.Input;

for i:=0 to vararrayhighbound(inBuf,1) do

begin

if m_sourceLen > 500 then

m_sourceLen := 0;

m_pSourceBuf[m_sourceLen]:=inBuf[i];

m_sourceLen:=m_sourceLen+1;

end;

if(CommDataAnalysis()) then //如果分幀成功

begin

m_ReSendTimes := 0; //重發次數為0

for j:=0 to m_nRecDataLength-1 do

showstr:=showstr + inttohex(inBuf[j],2)+' '; // _GetByte(inBuf[i]);

if not bPauseFlag then

showframe(showstr,true)

else

begin

if length(showstr)>5000 then

showstr:='';

end;

pcurDeviceSer:=nil;

if(m_nRecDataLength = 5) then//固定幀處理

begin

for itemp:=0 to numberofdec do // numberofdec//裝置個數 ,遍歷,查找需要的裝置

begin

if BDeviceSer[itemp].addr=RecBuf[2] then

begin

pcurDeviceSer:=@BDeviceSer[itemp]; //指針指向被召喚的裝置的結構體

break;

end;

end;

if pcurDeviceSer=nil then //所召喚的裝置不存在

else

FrameFix(pcurDeviceSer);

end

else //可變幀處理

begin

for itemp:=0 to numberofdec do // numberofdec//裝置個數 ,遍歷,查找需要的裝置

begin

if BDeviceSer[itemp].addr=RecBuf[4] then

begin

pcurDeviceSer:=@BDeviceSer[itemp];

break;

end;

end;

if pcurDeviceSer=nil then //所召喚的裝置不存在

else

FrameUnFix(pcurDeviceSer);

end;

end;

end;

// end;

end;

發送串口數據:

procedure SendComData();

var

i,j:integer;

begin // Main_Form.dqc.ConvertStr2Hex(tempstr,SendBuf,m_nSendDataLength);

if (SendBuf[0]=$10) then

m_nSendDataLength:=5

else

m_nSendDataLength:=((SendBuf[1] and $ff)+6); //+號比&(按位與運算符)優先級高.

outBuf := VarArrayCreate([0,m_nSendDataLength-1], varByte);

for i:=0 to m_nSendDataLength-1 do

outBuf[i]:=SendBuf[i];

F_Com.MSComm.Output:=outBuf;

上面的例子只是為了說明使用方法,並不可運行。

  • 上一篇:設立配送中心的規劃方案(原件)
  • 下一篇:VISA shared components是什麽東西
  • copyright 2024編程學習大全網