【聚杰网VC】Windows平台下基于串口的数据采集系统
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; } |
代开串口并设置成功后,返回TRUE,否则返回FALSE。
4.2 设置定时器,并定时读串口
| //设置定时读串口 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个字节读入 //处理读入的数据 //... } } |




