您的位置:首页 > 编程语言

CPSerialPort类源代码阅读

2009-08-26 14:13 246 查看
CPSerialPort类源代码阅读
文件PSerialPort.h,PSerialPort.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);
……………
}

整个接收过程如此。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: