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;
上面的例子只是為了說明使用方法,並不可運行。