de here OVERLAPPED m_osWrite; memset(&m_osWrite,0,sizeof(OVERLAPPED)); m_osWrite.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL); char lpOutBuffer[7]; memset(lpOutBuffer,''\0'',7); lpOutBuffer[0]=''\x11''; lpOutBuffer[1]=''0''; lpOutBuffer[2]=''0''; lpOutBuffer[3]=''1''; lpOutBuffer[4]=''0''; lpOutBuffer[5]=''1''; lpOutBuffer[6]=''\x03''; DWORD dwBytesWrite=7; COMSTAT ComStat; DWORD dwErrorFlags; BOOL bWriteStat; ClearCommError(hCom,&dwErrorFlags,&ComStat); bWriteStat=WriteFile(hCom,lpOutBuffer, dwBytesWrite,& dwBytesWrite,&m_osWrite); if(!bWriteStat) { if(GetLastError()==ERROR_IO_PENDING) { WaitForSingleObject(m_osWrite.hEvent,1000); } } } void CRS485CommDlg::OnReceive() { // TODO: Add your control notification handler code here OVERLAPPED m_osRead; memset(&m_osRead,0,sizeof(OVERLAPPED)); m_osRead.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL); COMSTAT ComStat; DWORD dwErrorFlags; char str[100]; memset(str,''\0'',100); DWORD dwBytesRead=100;//读取的字节数 BOOL bReadStat; ClearCommError(hCom,&dwErrorFlags,&ComStat); dwBytesRead=min(dwBytesRead, (DWORD)ComStat.cbInQue); bReadStat=ReadFile(hCom,str, dwBytesRead,&dwBytesRead,&m_osRead); if(!bReadStat) { if(GetLastError()==ERROR_IO_PENDING) //GetLastError()函数返回ERROR_IO_PENDING,表明串口正在进行读操作 { WaitForSingleObject(m_osRead.hEvent,2000); //使用WaitForSingleObject函数等待,直到读操作完成或延时已达到2秒钟 //当串口读操作进行完毕后,m_osRead的hEvent事件会变为有信号 } } PurgeComm(hCom, PURGE_TXABORT| PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR); m_disp=str; UpdateData(FALSE); } //打开ClassWizard,为静态文本框IDC_DISP添加CString类型变量m_disp,同时添加WM_CLOSE的相应函数: void CRS485CommDlg::OnClose() { // TODO: Add your message handler code here and/or call default CloseHandle(hCom); //程序退出时关闭串口 CDialog::OnClose(); } //您可以仔细对照这两个例程,细心体会串口同步操作和异步操作的区别。
作者“情っ㈠颗欲枯 草丶 ”
|