程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> MSComm控件的Modem通訊

MSComm控件的Modem通訊

編輯:關於VC++

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流控方式

本文配套源碼

  1. 上一頁:
  2. 下一頁:
欄目導航
Copyright © 程式師世界 All Rights Reserved