MSComm 控件通過串行端口(serial port)傳送和接收數據,為應用程序提供了串行通訊功能。而且在可視化編程盛行的今天,可以很方便的在Visual Basic(VB)、Visual C++(VC)、Delphi等語言及開發平台中應用。
MSComm 是 Microsoft 公司為簡化Windows下串行端口編程而提供的ActiveX控件,它提供了一系列標准通訊命令的使用接口,為應用程序提供了通過串行口收發數據的簡潔方法。處理數據的方式有事件驅動(Event-driver)、查詢法(Inquire)兩種。
1.事件驅動法
在使用事件驅動法設計程序時,每當有新字符到達、端口狀態變化或發生錯誤時,MSComm控件將解發OnComm事件,而應用程序在捕獲該事件後,通過檢查MSComm控件的CommEvent屬性可以獲知所發生的事件或錯誤,從而采取相應的操作。這種方法的優點是程序響應及時,可靠性高。
2.查詢法
這種方法適合於較小的應用程序。在這種情況下,每當應用程序執行完某一串行口操作後,將不斷檢查MSComm控件的CommEvent屬性以檢查執行結果或者檢查某一事件是否發生。例如,當程序向串行設備發送了某個命令後,可能只是在等待收到一個特定的響應字符串,而不是對收到的每一個字符都立刻響應並處理。
在VC中添加?MSComm控件非常簡單。在打開的工程中,選擇菜單Project->Add To Project->Component and Controls,在彈出的對話框“Component and Controls Gallery”中選中“Microsoft Communication Controls Version 6.0”?,單擊“Insert”按鈕即可完成添加MSComm控件操作。
本工程應用采用事件驅動法,具體實現如下:
一.串口信息配置
按上述方法完成在基於對話框的應用程序中添加MSComm控件操作並增加相應成員變量m_comm。在對話框模板上右鍵單擊MSComm控件,選擇Property菜單項,即可設置MSComm控件各項屬性。在此調制解調器通訊的程序中,設置“Control”屬性頁中Handshaking項為“2-comRTS”,否則國內部分廠家modem不能正常通訊。其它接受缺省設置。
另外亦可通過修改對話框類的OnInitDialog()函數來設置控件的屬性。具體參考MSDN中的關於Comm Control的詳細說明。 if(m_comm.GetPortOpen())
二.接收數據
{
m_comm.SetPortOpen(FALSE); //設置串口配置信息前先要關閉串口
}
m_comm.SetCommPort(1); //Com1串行口
m_comm.SetSettings("9600,n,8,1"); //設置波特率為9600bps,無奇偶校驗位,數據位8位,停止位1位
m_comm.SetInputMode(1); //設置數據通訊格式為二進制數組格式
m_comm.SetRThreshold(1); //設置為每次接到一個字節數據就觸發OnComm事件
if(!m_comm.GetPortOpen())
{
m_comm.SetPortOpen(TRUE);
}
m_comm.GetInput(); //清除串口輸入緩沖區中殘留數據
m_SendData="ATZ\r\n"; //調制解調器初始化
m_comm.SetOutput(COleVariant(m_SendData));
添加接收數據函數,在對話框中雙擊Comm Control,接受默認函數,則對話框類的成員函數為OnCommMscomm(),添加代碼如下: Sleep(500); //視各廠家modem而定。不加則數據接受不全
VARIANT m_input;
char *str,*str1;
int k,nEvent,i,len,m;
CString str2;
m_ReceiveData="";
nEvent=m_comm.GetCommEvent();
switch(nEvent)
{
case 2: //收到大於RTHresshold個字符
k=m_comm.GetInBufferCount(); //接收緩沖區的字符數目
if(k>0)
{
m_input=m_comm.GetInput();
str=(char*)(unsigned char*)m_input.parray->pvData;
}
?i=0;
str1=str;
while(i<k)
{
i++;
str1++;
}
*str1=''\0'';
str2=(const char*)str; //清除字符串中的不必要字符
m_ReceiveData=(const char *)str;
break;
case 3: //CTS線狀態發生變化
break;
case 4: //DSR線狀態發生變化
break;
case 5: //CD線狀態發生變化
break;
case 6: //Ring Indicator發生變化
break;
}
以上是在做工程之余寫下的一點東西。VC我是初學者,有錯誤的地方,還請各位批評指正。例子在VC 6.0+Win2000下調試通過。Win98下測試數據接收不全。還望高手指點一二。
E-mail:[email protected]
附:
單片機或PC機對MODEM的控制是通過設置MODEM的S寄存器和發送標准AT命令來實現的。命令行由AT或at開始,不能是At或aT。它的一般格式為“AT+指令+回車”常用的AT命令簡介如下,詳細的AT命令見本說明書附錄。
&F 恢復出廠設置
DT××× 音頻撥號, ×××表示電話號碼
+++ 切換到在線命令狀態
Sn=X 寫S寄存器
Hn 摘機/掛機控制
n=0 掛機
n=1 摘機
S0=X X=0,不自動應答
X=1~255,振鈴指定次數後自動應答
\N0 異步方式設定為0
\q0 XON\XOFF流控方式
本文配套源碼