posts - 45,  comments - 232,  trackbacks - 0

     例子工程使用VS2003编译通过。

      下载地址如下:http://www.cppblog.com/Files/dyj057/MySerialPort08-8-22.rar

      所谓异步串口数据接收就是串口数据的接收是在一个独立的线程完成了。当串口有数据返回时,会自动执行自定义的回调函数代码,而不是像传统的使用Read函数去串口数据。

      我在PJ Naughter的串口类CSerialPort的基础上,继承得到了自己的CAsyncSerialPort类,还声明了一个ISerialPortObserver接口来监视串口活动,如打开、关闭、数据发送完成,数据接收,处理错误信息等。实用的时候,从ISerialPortObserver继承一个类,实现里面的纯虚方法,然后把这个类的一个实例加入通过CAsyncSerialPort类中的void AtachObserver(ISerialPortObserver *pObserver)方法加入串口实例中,就能实现对串口活动的监控了。

 其中最核心的代码就是CAsyncSerialPort事件处理,实现数据的异步接收:

int CAsyncSerialPort::Run()
{
    
try
    {
        
//events array
        HANDLE waitHandles[4]= { 
            m_portClosingEvent,
            m_readEvent, 
            m_breakEvent,
            m_writeEvent}; 
            
        WORD dwStoredFlags 
= EV_BREAK | EV_CTS | EV_DSR | EV_ERR | EV_RING | \
            EV_RLSD 
| EV_RXCHAR | EV_RXFLAG | EV_TXEMPTY;

        SetMask(dwStoredFlags);
        DWORD dwMask;
        SetBreakEvent(dwMask);
        SetReadEvent(m_readOverlapped);
        
        DWORD dwEventIndex;
        
while(TRUE)
        {
            dwEventIndex 
= ::WaitForMultipleObjects(4,waitHandles,false,INFINITE);
            
switch(dwEventIndex)
            {
            
case WAIT_OBJECT_0:
                TRACE(_T(
"Receive serial port close event, exit read thread.\n"));
                
return 0L;
            
case WAIT_OBJECT_0+1//read event
                {
                    HandleReadEvent(m_readOverlapped);
                    SetReadEvent(m_readOverlapped);
                }
                
break;
            
case WAIT_OBJECT_0 +2//break event
                {
                    HandleBreakEvent(dwMask);
                    SetBreakEvent(dwMask);
                }
                
break;
            
case WAIT_OBJECT_0 +3:
                {
                    HandleWriteEvent(m_writeOverlapped);
                }
                
break;
            
case WAIT_FAILED:
                THROW_EX_CODE( ::GetLastError() );
            
default:
                ASSERT(FALSE);
                
return 0L;
            }
        }
    }
    
catch (CRuntimeException* e)
    {
        OnError(e
->GetErrorMessage());

        e
->Delete();
    }

    
return 0L;
}

 

   该串口实现是我在Win32平台使用过的最稳定实现,呵呵,经验总结,在多个地方使用过,请放心使用。

   终于实现我说的写个串口编程专题的第一步,不容易,太忙了。

posted on 2007-08-22 19:59 天下无双 阅读(6240) 评论(5)  编辑 收藏 引用 所属分类: C/C++

FeedBack:
# re: 串口编程(1)--MFC中的异步串口实现(包含实现源代码)
2007-08-23 09:52 | zenith
最近也开始接触串口编程,顶一个先!  回复  更多评论
  
# re: 串口编程(1)--MFC中的异步串口实现(包含实现源代码)
2007-08-23 15:31 | 天意
串口操作使用AT指令最好也是最简单的了,或者使用delphi的行间汇编,那样更简单,楼上的这个代码还是只能用来测试串口的,实际应用还远远不够的!  回复  更多评论
  
# re: 串口编程(1)--MFC中的异步串口实现(包含实现源代码)
2007-08-23 15:35 | 天下无双
那些地方不够用?请指正。  回复  更多评论
  
# re: 串口编程(1)--MFC中的异步串口实现(包含实现源代码)[未登录]
2009-01-10 22:34 | Sam
Very good work!  回复  更多评论
  
# re: 串口编程(1)--MFC中的异步串口实现(包含实现源代码)
2009-03-04 15:37 | skyking
这个只能在CDialog中用
能在Doc/View体系中使用么?  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理



常用链接

留言簿(15)

随笔分类

随笔档案

相册

我的其它领域Blog

搜索

  •  

积分与排名

  • 积分 - 202682
  • 排名 - 128

最新评论

阅读排行榜

评论排行榜