采用同步方式的查询方式读取串口数据时,若由于串口操作耗费较长的时间,则程序会被挂起.为解决这种问题,可以在读取数据时采用重叠I/O操作.此时,读写数据的操作在单独的线程中进行,发出读写要求的主线程可以继续运行.当读写数据成功后,读写数据线程可以通过某种方式通知主线程.两个线程协调工作,可以明显提高程序的效率.
为了实现重叠I/O操作,主要有如下几个编程步骤: 定义全局变量、创建串口、发出读写操作、读写线程函数的建立、关闭串口等.
1. 定义全局变量
HANDLE hCom; //串口句柄
DWORD ThreadProcWrite(LPVOID pParam); //写线程函数
DWORD ThreadProcRead(LPVOID pParam); //读线程函数
OVERLAPPED Wol = { 0 }; //写操作OVERLAPPED结构变量
OVERLAPPED Rol = { 0 }; //读操作OVERLAPPED结构变量
HANDLE hThreadWrite; //写线程句柄
HANDLE hThreadRead; //读线程句柄
HWND hWnd; //窗口句柄
2. 创建串口
hCom = CreateFile ( "COM2",
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,//使用重叠方式
NULL );
if( hCom != INVALID_HANDLE_VALUE)
{
SetupComm(hCom,1024,512);
DCB myDCB;
GetCommState( hCom,&myDCB);
myDCB.BaudRate=CBR_19200;
myDCB.fBinary=TRUE;
myDCB.fParity=TRUE;
myDCB.ByteSize=8;
myDCB.Parity=ODDPARITY;
myDCB.StopBits=ONESTOPBIT;
SetCommState(hCom,&myDCB);
}
else
{
AfxMessageBox("创建串口失败!");
}
hWnd = GetSafeHwnd(); //获取当前窗口的句柄
3. 发出读写操作
(1) 读操作
在读操作中,只是启动读线程.实际的读操作在读线程函数中完成.
DWORD dwThreadID;
DWORD dwParam;
hThreadRead = CreateThread ( NULL,
0,
(LPTHREAD_START_ROUTINE)ThreadProcRead,
&dwParam,
0, //创建线程后,立即执行该线程
&dwThreadID);
if(hThreadRead==NULL)