Chinaunix首页 | 论坛 | 博客
  • 博客访问: 14538948
  • 博文数量: 5645
  • 博客积分: 9880
  • 博客等级: 中将
  • 技术积分: 68081
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-28 13:35
文章分类

全部博文(5645)

文章存档

2008年(5645)

我的朋友

分类:

2008-04-28 21:25:25

下载本文示例代码
  目前,在用计算机进行数据传输时,常用的是串行通信方式。在Visual C++的编程中,既可以用Windows API函数进行串行通信编程,也可以利用环境自带的控件进行编程。利用 API函数编写实际应用程序时,往往要考虑多线程的问题,这样编出来的程序不但十分庞大,而且结构比较复杂,继承性差,维护困难。但是使用串行通信控件就相对简单一些,而且功能强大,性能安全可靠。   本文以Microsoft Communications Control(version 6.0)为例,介绍串行通信控件在VC++中的使用方法。   嵌入通信控件   使用串行通信控件前,首先要进行系统注册。   1、在建立新工程时,将ActiveX Controls复选框选中,表示本程序支持ActiveX 控件。   2、单击Project菜单,从中选择Add to Project,在弹出的对话框中单击Components and Controls选项,然后在弹出的对话框中再单击Registered ActiveX Controls选项。   3、在列表中选择Microsoft Communications Control (version6.0),形状为带有红色底座的黄色电话机。单击Insert按钮,确认后,会出现一个Confirm Classes对话框,其中列出了该控件的类名(CMSComm)、头文件名(MSComm.h)、执行文件名(MSComm.cpp)。   关闭此对话框,在程序主界面的控件列表中,可以看到该通信控件已被加入,拖动该控件就可以将其放入程序中。   编写通信程序   通信控件的工作原理类似于中断方式,当有通信事件发生时,如发送、接收数据,就会触发OnComm事件。在OnComm事件的处理函数中调用 GetCommEvent()函数,由该函数的返回值即可确定是什么类型的事件,并由此做出相应的处理。   下面以接收处理串口的GPS信号为例,说明该控件在编程中的具体应用。   利用MFC生成一个基于对话框的应用程序,对话框中的控件及其相应的消息与响应函数如下表所示。 控件名称 控件 ID 对应变量 通信控件 IDC_MSCOMM m_Comm 接收按钮 IDC_BUTTON_RECEIVEGPSDATA OnbuttonStartreceivegps() GPS信号显示 IDC_EDIT_COMDATA m_comdata 停止接收按钮 IDC_BUTTON_ENDRECEIVEGPSDATA OnbuttonEndreceivegps()   设置控件各部分属性:    CommPort:1;    DTREnable:1;    InBufferSize:4096;    EOFEnable:TRUE;    Handshaking:nohandshaking;    InputMode:1-Binary;    NullDiscard:False;    Rthreshold:250;    RTSEnable:False;    Settings:9600,n,8,1;    Sthreshold:0。   部分程序如下: //开始接收GPS信号 void CGpsDlg::OnButtonStartreceivegps() {  //判断串口的状态,如果是关闭状态,则打开  if(!m_Comm.GetPortOpen() )   //打开串口   m_Comm.SetPortOpen(TRUE);  UpdateData(TRUE); } //停止接收GPS的信号 void CGpsDlg::OnButtonEndreceivegps(); {  //判断串口的状态,如果是打开状态,则关闭  if( m_Comm.GetPortOpen() )   m_Comm.SetPortOpen(FALSE);  UpdateData(FALSE); } //相应的OnComm事件处理 void CGpsDlg::OnComm() {  m_comdata.Empty();  VARIANT m_input1;  COleSafeArray m_input2;  LONG length,i;  BYTE data[1024];  CString str;  //接收缓冲区内字符  if(m_Comm.GetCommEvent()== 2)  {   m_comdata.Empty();   //读取缓冲区内的数据   m_input1=m_Comm.GetInput();   //将VARIANT型变量转换为ColeSafeArray型变量   m_input2=m_input1;   //确定数据长度   length=m_input2.GetOneDimSize();   //将数据转换为BYTE型数组   for(i=0;i< length;i++)    m_input2.GetElement(&i,data+i);    //将数组转换为CString型变量   for(i=0;i< length;i++) {    char a=* (char *)(data+i);    str.Format(“%c",a);    m_comdata += str;   }   /*在上面的程序中,先将VARIANT型变量   转换为ColeSafeArray型变量,再将其转换为   BYTE型数组,然后将数组转换为CString型变量,   以满足不同的变量类型显示数据的需要。*/   //提取GPS信号   CString m_zjz;   m_zjz=m_comdata;   //寻找GPS信号的头标志   int s;   s=m_zjz.Find(“$GPRMC,");   CString m_gps;   //NUM为所提取GPS信号的长度   m_gps=m_zjz.Mid(s,NUM);   int x;   x=m_gps.GetLength();   //信号长度不符合要求,则拒绝接收   if (x != NUM) {    m_gps.Empty();   }   //寻找所需要的GPS信号的头标志   int y;   y=m_gps.Find(“$GPRMC,");   if (y != 0)   {    m_gps.Empty();   }   //m-gpsdata是已声明的类成员变量   m_gpsdata=m_gps;  } }   这样就将GPS信号的数据流提取出来了。再通过简单的字符串操作就可以分别找出GPS信号中的经度、纬度以及相对应的格林威治时间等定位信息。   以上程序在Win98/95/NT、P133 PC机、ROCKWELL JUPITER GPS接收板环境下调试通过。   目前,在用计算机进行数据传输时,常用的是串行通信方式。在Visual C++的编程中,既可以用Windows API函数进行串行通信编程,也可以利用环境自带的控件进行编程。利用 API函数编写实际应用程序时,往往要考虑多线程的问题,这样编出来的程序不但十分庞大,而且结构比较复杂,继承性差,维护困难。但是使用串行通信控件就相对简单一些,而且功能强大,性能安全可靠。   本文以Microsoft Communications Control(version 6.0)为例,介绍串行通信控件在VC++中的使用方法。   嵌入通信控件   使用串行通信控件前,首先要进行系统注册。   1、在建立新工程时,将ActiveX Controls复选框选中,表示本程序支持ActiveX 控件。   2、单击Project菜单,从中选择Add to Project,在弹出的对话框中单击Components and Controls选项,然后在弹出的对话框中再单击Registered ActiveX Controls选项。   3、在列表中选择Microsoft Communications Control (version6.0),形状为带有红色底座的黄色电话机。单击Insert按钮,确认后,会出现一个Confirm Classes对话框,其中列出了该控件的类名(CMSComm)、头文件名(MSComm.h)、执行文件名(MSComm.cpp)。   关闭此对话框,在程序主界面的控件列表中,可以看到该通信控件已被加入,拖动该控件就可以将其放入程序中。   编写通信程序   通信控件的工作原理类似于中断方式,当有通信事件发生时,如发送、接收数据,就会触发OnComm事件。在OnComm事件的处理函数中调用 GetCommEvent()函数,由该函数的返回值即可确定是什么类型的事件,并由此做出相应的处理。   下面以接收处理串口的GPS信号为例,说明该控件在编程中的具体应用。   利用MFC生成一个基于对话框的应用程序,对话框中的控件及其相应的消息与响应函数如下表所示。 控件名称 控件 ID 对应变量 通信控件 IDC_MSCOMM m_Comm 接收按钮 IDC_BUTTON_RECEIVEGPSDATA OnbuttonStartreceivegps() GPS信号显示 IDC_EDIT_COMDATA m_comdata 停止接收按钮 IDC_BUTTON_ENDRECEIVEGPSDATA OnbuttonEndreceivegps()   设置控件各部分属性:    CommPort:1;    DTREnable:1;    InBufferSize:4096;    EOFEnable:TRUE;    Handshaking:nohandshaking;    InputMode:1-Binary;    NullDiscard:False;    Rthreshold:250;    RTSEnable:False;    Settings:9600,n,8,1;    Sthreshold:0。   部分程序如下: //开始接收GPS信号 void CGpsDlg::OnButtonStartreceivegps() {  //判断串口的状态,如果是关闭状态,则打开  if(!m_Comm.GetPortOpen() )   //打开串口   m_Comm.SetPortOpen(TRUE);  UpdateData(TRUE); } //停止接收GPS的信号 void CGpsDlg::OnButtonEndreceivegps(); {  //判断串口的状态,如果是打开状态,则关闭  if( m_Comm.GetPortOpen() )   m_Comm.SetPortOpen(FALSE);  UpdateData(FALSE); } //相应的OnComm事件处理 void CGpsDlg::OnComm() {  m_comdata.Empty();  VARIANT m_input1;  COleSafeArray m_input2;  LONG length,i;  BYTE data[1024];  CString str;  //接收缓冲区内字符  if(m_Comm.GetCommEvent()== 2)  {   m_comdata.Empty();   //读取缓冲区内的数据   m_input1=m_Comm.GetInput();   //将VARIANT型变量转换为ColeSafeArray型变量   m_input2=m_input1;   //确定数据长度   length=m_input2.GetOneDimSize();   //将数据转换为BYTE型数组   for(i=0;i< length;i++)    m_input2.GetElement(&i,data+i);    //将数组转换为CString型变量   for(i=0;i< length;i++) {    char a=* (char *)(data+i);    str.Format(“%c",a);    m_comdata += str;   }   /*在上面的程序中,先将VARIANT型变量   转换为ColeSafeArray型变量,再将其转换为   BYTE型数组,然后将数组转换为CString型变量,   以满足不同的变量类型显示数据的需要。*/   //提取GPS信号   CString m_zjz;   m_zjz=m_comdata;   //寻找GPS信号的头标志   int s;   s=m_zjz.Find(“$GPRMC,");   CString m_gps;   //NUM为所提取GPS信号的长度   m_gps=m_zjz.Mid(s,NUM);   int x;   x=m_gps.GetLength();   //信号长度不符合要求,则拒绝接收   if (x != NUM) {    m_gps.Empty();   }   //寻找所需要的GPS信号的头标志   int y;   y=m_gps.Find(“$GPRMC,");   if (y != 0)   {    m_gps.Empty();   }   //m-gpsdata是已声明的类成员变量   m_gpsdata=m_gps;  } }   这样就将GPS信号的数据流提取出来了。再通过简单的字符串操作就可以分别找出GPS信号中的经度、纬度以及相对应的格林威治时间等定位信息。   以上程序在Win98/95/NT、P133 PC机、ROCKWELL JUPITER GPS接收板环境下调试通过。 下载本文示例代码


Visaul C 6.0中使用串行通信控件Visaul C 6.0中使用串行通信控件Visaul C 6.0中使用串行通信控件Visaul C 6.0中使用串行通信控件Visaul C 6.0中使用串行通信控件Visaul C 6.0中使用串行通信控件Visaul C 6.0中使用串行通信控件Visaul C 6.0中使用串行通信控件Visaul C 6.0中使用串行通信控件Visaul C 6.0中使用串行通信控件Visaul C 6.0中使用串行通信控件Visaul C 6.0中使用串行通信控件Visaul C 6.0中使用串行通信控件Visaul C 6.0中使用串行通信控件Visaul C 6.0中使用串行通信控件
阅读(112) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~