CPSerialPort类源代码阅读

CPSerialPort类源代码阅读

       文件PSerialPort.hPSerialPort.cpp完成WinCE下串口访问功能,可以到http://www.pudn.com/downloads185/sourcecode/windows/comm/detail869673.html下载该两个文件。这里分析一下CPSerialPort类是如何实现收到数据后触发用户.

       首先,先看类CPSerialPort最基本的使用:

       //引用头文件

#include "PSerialPort.h"

 

//声明接收函数

void OnDataArrive(char *data,int length,DWORD userdata);

 

 

//打开串口并激活

CPSerialPort m_serial;

bOpenComm = m_serial.OpenPort(ss2, baud, 8, 1, 0, OnDataArrive,(DWORD)this);

m_serial.Activate();

 

 

//发送

m_serial.WritePort("HelloWorld", 10);

 

 

//接收:收到数据时自动触发该函数

void OnDataArrive(char *data,int length,DWORD userdata)

{

       //data为数据指针

       //length为收到的数据长度

}

 

       上面先声明一个接收函数“OnDataArrive”,用来定义收到数据后的操作,该函数需要用户自己完成:收到数据应该做什么!“OnDataArrive”函数通过入口OpenPort( )来完成注册。

       来到函数CPSerialPort::OpenPort(LPCTSTR Port,int BaudRate,int DataBits,int StopBits,int Parity,LPDataArriveProc proc,DWORD userdata)中:

       ……………

       m_lpDataArriveProc=proc;

       ……………

       lpDataArriveProc的声明在头文件PSerialPort.h中:

              typedef void (*LPDataArriveProc)(char *data,int length,DWORD userdata);

       ……………

              LPDataArriveProc m_lpDataArriveProc;

       ……………

       调用m_lpDataArriveProc,实际上也是调用用户自己写的收到数据处理函数,在PSerialPort.cpp文件。在以下函数中调用:

DWORD WINAPI CPSerialPort::ReadPortThread(LPVOID lpParameter)

{

……………

 

       while((m_pSerial->m_hComm!=INVALID_HANDLE_VALUE)&&(m_pSerial->m_bReceiving))

       {           

              fReadState=ReadFile(m_pSerial->m_hComm,buf,m_pSerial->m_nBufferSize,&dwLength,NULL);

              if(!fReadState)

              {

                     //AfxMessageBox(_T("无法从串口读取数据!"));

              }

              else

              {

                     if(dwLength!=0)

                     {

                            //回送数据

                            if(m_pSerial->m_lpDataArriveProc!=NULL)

                            {

                                                        m_pSerial->m_lpDataArriveProc(buf,dwLength,m_pSerial->m_dwUserData);

                            }

                     }

              }           

       }

 

……………

}

而函数CPSerialPort::ReadPortThread是在CPSerialPort:: Activate ()(该函数由用户调用完)中创建的一个线程函数:

BOOL CPSerialPort::Activate()

{

……………

              m_hReadThread=CreateThread(NULL,0,ReadPortThread,this,0,NULL);

……………

}

 

整个接收过程如此。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值