注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

沙粒的博客

 
 
 

日志

 
 

MFC:串口通信模板-2  

2014-11-08 17:06:36|  分类: 通信 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
篇幅限制本文分为2篇,此为第二篇

      CloseHandle(olap.hEvent);

                           return false;

                    }

             }

      }

 

      //关闭事件句柄

      CloseHandle(olap.hEvent);

 

      return true;

}

 

5、线程响应函数的声明定义。功能完成读串口。

1)在CPctestDlg头文件中声明函数afx_msg void OnReceiveData(WPARAM wParam,LPARAM lParam);

2)在CPctestDlg.cpp中声明信息映射ON_MESSAGE (UM_RECEIVE, OnReceiveData)

3)在CPctestDlg.cpp中定义函数,void CScmDlg::OnReceiveData(WPARAM wParam,LPARAM lParam)

代码:

//信息响应函数,

void CPctestDlg::OnReceiveData(WPARAM wParam,LPARAM lParam)

{

             //定义变量

      char buf[1024]; //读串口缓存

      DWORD nlength;    //读串口字节数

      DWORD dwReadsize=100;  //每次读串口字节数

 

      CString str="";

 

      //审核,如果串口无效或参数不是EV_RXCHAR,函数返回

      if(!m_hcom || (wParam & EV_RXCHAR)!=EV_RXCHAR )

      {

             SetEvent(m_hPostMsgEvent);

             return ;

      }

 

      //接收数据

      nlength=ReadComm(buf,dwReadsize);

 

      //对接收到的字符处理,并显示

      if(nlength)

      {

             for(DWORD i=0; i<nlength;i++)

             {            

                    str+=buf[i];

             }

      }

 

      /*    //信息处理

      if(判定)

      {

        处理语句

      }

      else if()

      {

        处理语句

      }

      else if(判定)//

      else

      {

        处理语句

      }

      */

}

 

6ReadComm函数的定义。

1)在CPctestDlg中添加此函数,

2)在CPctestDlg中添加变量OVERLAPPED  m_lapRead;

3)在CPctestDlg的构造函数中定义m_lapRead变量。

//初始化m_lapRead 结构

memset(&m_lapRead,0,sizeof(OVERLAPPED));

//定义事件,符合异步要求,手动,初始nonsignaled

m_lapRead.hEvent=CreateEvent(NULL,true,false,NULL);

4)在CPctestDlg的析构函数中关闭

5)函数代码:

//读串口dwLength字节,存放在buf

DWORD CPctestDlg::ReadComm(char * buf,DWORD     dwlength)

{

      //定义变量

      DWORD dwError; //串口错误信息

      COMSTAT comstat; //串口状态信息结构

 

      DWORD length=0; //读取串口字节数

 

 

 

      //刷新串口、获取信息

      ClearCommError(m_hcom,&dwError,&comstat);

 

      //关键语句

      //获取2参数中较小值,用于返回串口缓存中实际字节数

      length=min(dwlength,comstat.cbInQue);

 

      //读串口,此操作是读缓存,不需要异步等待语句

      //函数立即返回1.

      ReadFile(m_hcom,buf,length,&length,&m_lapRead);

 

      return length;

 

}

 

7、为IDC_BNT_SEND控件添加响应函数

代码

 

//发送字符串

void CPctestDlg::OnBntSend()

{

   //发送信息  如:     

      WriteComm("001000",sizeof("001000"));   

}

 

8WriteComm函数定义

1)在CPctestDlg中添加WriteComm函数

2)在CPctestDlg中添加变量OVERLAPPED m_lapWrite;

3)在CPctestDlg的构造函数中定义m_lapWrite变量。

//初始化m_lapWrite 结构

      memset(&m_lapWrite,0,sizeof(OVERLAPPED));

      //定义事件,符合异步要求,手动,初始nonsignaled

      m_lapWrite.hEvent=CreateEvent(NULL,true,false,NULL);

 

4)在CPctestDlg的析构函数中关闭

5)函数代码

 

DWORD CScmDlg::WriteComm(char* buf,DWORD dwlength)

{

      //定义变量

      DWORD dwError; //串口错误信息

      COMSTAT comstat; //串口状态信息结构

 

      DWORD length=dwlength;

 

      //清理串口,获取串口信息

      ClearCommError(m_hcom,&dwError,&comstat);

 

      //写串口

      BOOL fresult=WriteFile(

             m_hcom,

             buf,

             length, //输入参数,待写入串口字节数

             &length,  //输出参数,实际写入串口字节数

             &m_lapWrite);

 

      //等待异步操作结束

      if(fresult==0)

      {

             if(GetLastError()==ERROR_IO_PENDING)

             {

                    //满足异步操作添加,等待异步操作结束,函数返回

                    GetOverlappedResult(

                           m_hcom,

                           &m_lapWrite,

                           &length,

                           true);                  

             }

             length=0;

      }

 

 

 

 

 

 

      return length;

 

}

 

  评论这张
 
阅读(272)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017