
| HANDLE CreateFile( LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSA, DWORD dwCreate, DWORD dwFlagsAndAttributes, HANDLE hTemplate ); |
| BOOL SetCommTimeouts( HANDLE hFile, LPCOMMTIMEOUTS lpTimeouts ); |
其中第二个参数是一个指向串口超时结构(COMMTIMEOUTS)的指针。该结构指明了串口读写的各种超时间隔值。当设置结构成员 ReadIntervalTimeout为MAXDWORD,并且同时设置成员ReadTotalTimeoutConstant以及成员 ReadTotalTimeoutMultiplier为0时,ReadFile函数会立即返回,即使没有读入任何字节。这样就不会引起任何阻塞了。
4、程序关键代码
基于以上介绍的方法,作者开发了一套Windows环境下基于串口的数据采集系统,经过长时间的测试,运行良好。
程序接收到用户的开始测试命令后,打开并设置串口。采用非重叠I/O模式,并设置超时值使得ReadFile函数在没有串口数据情况下立即返回。程序使用定时器来定时读取串口数据。实践证明,这种方式编程容易,结构清晰,并且占用系统资源较少。下面给出程序关键代码。
4.1 打开并设置串口
| //READBUFFER和WRITEBUFFER是 //用户自己定义的两个宏 BOOL InitCOM(LPCTSTR strPort, DWORD BaudRate, //波特率 BYTE ByteSize, //字节长度 BYTE Parity, //校验位 BYTE StopBits, //停止位 DWORD dwInQueue = READBUFFER, //读缓冲区大小 DWORD dwOutQueue = WRITEBUFFER //写缓冲区大小 ) { DCB dCB; COMMTIMEOUTS ct; //打开串口,并得到串口句柄 m_hCOM = CreateFile( strPort, GENERIC_READ | GENERIC_WRITE,0, NULL, OPEN_EXISTING,0, NULL); if(m_hCOM==INVALID_HANDLE_VALUE) return FALSE; //初始化串口,设置读写缓冲区大小 if( !SetupComm(m_hCOM, dwInQueue, dwOutQueue) || !PurgeComm(m_hCOM, PURGE_TXCLEAR|PURGE_RXCLEAR) ) { CloseHandle(m_hCOM); m_hCOM=INVALID_HANDLE_VALUE; return FALSE; } //设置DCB结构 if(!GetCommState(m_hCOM, &dCB)) { CloseHandle(m_hCOM); m_hCOM=INVALID_HANDLE_VALUE; return FALSE; } dCB.BaudRate = BaudRate; dCB.ByteSize = ByteSize; dCB.Parity = Parity; dCB.StopBits = StopBits; if(!SetCommState(m_hCOM, &dCB)) { CloseHandle(m_hCOM); m_hCOM= INVALID_HANDLE_VALUE; return FALSE; } //设置超时值,使得当串口没有数据时, //ReadFile函数立即返回 ct.ReadIntervalTimeout= MAXDWORD; ct.ReadTotalTimeoutConstant= 0; ct.ReadTotalTimeoutMultiplier= 0; ct.WriteTotalTimeoutConstant= 0; ct.WriteTotalTimeoutMultiplier=0; if(!SetCommTimeouts(m_hCOM, &ct)) { CloseHandle(m_hCOM); m_hCOM= INVALID_HANDLE_VALUE; return FALSE; } return TRUE; } |
| //设置定时读串口 SetTimer(hwnd,NULL, uElapse,Reading) //uElapse是定时器间隔时间(以毫秒为单位), //视底层串口数据发送电路而定, //一般使用50毫秒~5000秒 //Reading是读串口函数 VOID CALLBACK Reading( HWND hwnd,UINT uMsg,UINT_PTR idEvent,DWORD dwTime) { unsigned char buffer[READBUFFER]; if ( ReadFile(m_hCOM, buffer, pchBuffer, READBUFFER, &dwReadNum, NULL) && dwReadNum) { //有dwReadNum个字节读入 //处理读入的数据 //... } } |
【中国下载站】【设为主页】【收藏本页】【打印本文】【回到顶部】【关闭此页】