MSComm 控件的 Modem 通讯
2006-07-21 11:16:03 来源:WEB开发网另外亦可通过修改对话框类的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而定。不加则数据接受不全
以上是在做工程之余写下的一点东西。VC我是初学者,有错误的地方,还请各位批评指正。例子在VC 6.0+Win2000下调试通过。Win98下测试数据接收不全。还望高手指点一二。
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;
}
E-mail:qjxue@21cn.com
附:
单片机或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流控方式
更多精彩
赞助商链接