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

沙粒的博客

 
 
 

日志

 
 

MFC:pc_c51通信-2  

2014-11-14 22:32:19|  分类: 通信 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

5、信息处理函数ProcessNotification

5.1根据参数确定事件类型,进行相应处理。

5.2需在CTestDlg中定义函数用到的下列变量,

CString m_strRXData;

此变量将接收到的 数据流 转换为 字符串

代码

 

BOOL CTestDlg::ProcessNotification(WPARAM wparam, LPARAM lparam)

{

     //

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

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

     {

            MessageBox("no EV_RXCHAR");

            return true;

     }

 

     //定义变量

     BYTE buf[MAXBLOCK]; //读串口缓存

     DWORD nlength;    //读串口字节数

 

     //读串口数据,

     nlength=ReadComm(buf,MAXBLOCK);

 

     if(nlength==0)

     {

            MessageBox("read com err");

            return false;

     }

     else

     {

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

            {

                   m_strRXData+=buf[i];

                  

            }

     }

 

     //显示数据

     GetDlgItem(IDC_EDIT_receive)->SetWindowText(m_strRXData);

     return true;

}

6、上面函数中调用ReadComm函数,完成读串口功能

6.1需在CTestDlg中定义函数用到的下列变量,

OVERLAPPED m_osRead;

结构事件m_osRead.hEvent 定义在Oninitstruct函数中。

6.2代码

DWORD CTestDlg::ReadComm(BYTE* buf, DWORD dwlength)

{

     //定义变量

     DWORD dwError; //串口错误信息

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

 

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

 

 

 

     //刷新串口、获取信息

     ClearCommError(m_hcom,&dwError,&comstat);

 

     //关键语句

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

     length=min(dwlength,comstat.cbInQue);

 

     //

     memset(buf,0,dwlength);

 

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

     //函数立即返回1.

     BOOL flag=ReadFile(m_hcom,buf,length,&length,&m_osRead);

     if(flag==0)

     {

            if(GetLastError()==ERROR_IO_PENDING)

            {

                   //等待WaitCommEvent 函数异步操作的结果

                          //bWait=true,WaitCommEvent等待的事件发生后,此函数才返回

                          //注意此语句与 WaitForSingleObject语句

                          GetOverlappedResult(

                                 m_hcom,

                                 &m_osRead,

                                 &length, //实际传送的字节数

                                 true);

 

                          CString tem;

                          tem.Format("%d",length);

 

                          MessageBox(tem);

 

            }

     }

 

     return length;

 

}

7Oninitstruct函数代码

BOOL CTestDlg::Oninitstruct()

{

     //m_osRead 结构的事件成员定义,

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

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

     if(m_osRead.hEvent==NULL)

     {

            AfxMessageBox("in threadfun, CreateEvent error");

            return false;

     }

 

     //m_osWrite 结构的事件成员定义,

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

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

     if(m_osWrite.hEvent==NULL)

     {

            AfxMessageBox("in threadfun, CreateEvent error");

            return false;

     }

     return true;

}

8、发送键响应函数功能,获取edit输入数据,由串口发送出去。

代码

//发送数据

void CTestDlg::OnBNTsend()

{

     //记录输入字符数量

     DWORD num=0;

     //存放输入字符

     char ch[SENDNUM];

 

     CString str;

     int len;

 

    

     //获取IDC_EDIT_send控件输入数据

     //GetDlgItem函数获取ID参数对应的CWnd指针

     //GetWindowText函数将指定窗口的字符串保存在ch 字符数组中

     //int GetWindowText( LPTSTR lpszStringBuf, int nMaxCount )

     GetDlgItem(IDC_EDIT_send)->GetWindowText(str);

 

     len=str.GetLength();

 

 

     for(int i=0;i<len;i++)

            ch[i]=str.GetAt(i);

 

     //发送ch,空字符不发送

     //当输入多位数字时,高位在前,低位在后,

     //12ch[0]=2,ch[1]=1;

     WriteComm(ch,len);

}

9WriteComm(ch,len)函数的代码

 

DWORD CTestDlg::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_osWrite);

 

     //等待异步操作结束

     if(fresult==0)

     {

            if(GetLastError()==ERROR_IO_PENDING)

            {

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

                   GetOverlappedResult(

                          m_hcom,

                          &m_osWrite,

                          &length,

                          true);                

            }

            length=0;

     }

 

     return length;

}

 

 

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

历史上的今天

评论

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

页脚

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