| // Send the Datas. // 写数据到串口 BOOL CSaimIO::SendData(unsigned char *lpCommand, DWORD dwBytesToWrite) { BOOL fWriteStat ; DWORD dwBytesWritten ; DWORD dwErrorFlags; DWORD dwError; DWORD dwBytesSent=0; COMSTAT ComStat; char szError[ 128 ] ;
if (IoInfoData.fConnected == FALSE ) return ( FALSE ) ;
fWriteStat = WriteFile( IoInfoData.idComDev , lpCommand, dwBytesToWrite, &dwBytesWritten,NULL) ; // &IoInfoData.osWrite ) ;
if(dwBytesWritten != dwBytesToWrite) return FALSE;
if (!fWriteStat) { if(GetLastError() == ERROR_IO_PENDING) { while(!GetOverlappedResult( IoInfoData.idComDev , &IoInfoData.osWrite, &dwBytesWritten, TRUE )) { dwError = GetLastError(); if(dwError == ERROR_IO_INCOMPLETE) { // normal result if not finished dwBytesSent += dwBytesWritten; continue; } else { // an error occurred, try to recover wsprintf( szError, "向串口发送数据出错,错误代码: %u", dwError ) ;
MessageBox(NULL,szError,"发送数据出错",MB_ICONEXCLAMATION);
ClearCommError( IoInfoData.idComDev , &dwErrorFlags, &ComStat ) ; break; } } } else { // some other error occurred ClearCommError( IoInfoData.idComDev , &dwErrorFlags, &ComStat ) ;
if (dwErrorFlags > 0) { wsprintf( szError, "向串口发送数据出错,错误代码: %u", dwErrorFlags ) ;
MessageBox(NULL,szError,"发送数据出错",MB_ICONEXCLAMATION); }
return ( FALSE ); } } return ( TRUE ) ;
} // end of SendData()
// Read the Datas. // 从串口中读出数据 DWORD CSaimIO::GetData(unsigned char *DataBuffer, DWORD DataLength) { BOOL fReadStat ; COMSTAT ComStat ; DWORD dwErrorFlags; DWORD dwLength = DataLength; DWORD dwError; char szError[ 128 ] ; if (IoInfoData.fConnected == FALSE) return ( FALSE ) ;
// SetCommMask( IoInfoData.idComDev ,EV_RXCHAR) ; //设定为收到第一个字符时产生中断
// unsigned long dwFlg; // WaitCommEvent(IoInfoData.idComDev , &dwFlg, &IoInfoData.osRead); //等侍收到第一个字符事件发生 // if( (dwFlg & ( EV_RXFLAG | EV_RXCHAR )) == (EV_RXFLAG | EV_RXCHAR) ) { // only try to read number of bytes in queue ClearCommError( IoInfoData.idComDev, &dwErrorFlags, &ComStat ) ; dwLength = min( 128, ComStat.cbInQue ) ;
if (dwLength > 0) { fReadStat = ReadFile( IoInfoData.idComDev, DataBuffer, dwLength, &dwLength, &IoInfoData.osRead ); if (!fReadStat) { if (GetLastError() == ERROR_IO_PENDING) { // We have to wait for read to complete. // This function will timeout according to the // CommTimeOuts.ReadTotalTimeoutConstant variable // Every time it times out, check for port errors while(!GetOverlappedResult( IoInfoData.idComDev, &IoInfoData.osRead, &dwLength, TRUE )) { dwError = GetLastError(); if(dwError == ERROR_IO_INCOMPLETE) // normal result if not finished continue; else { // an error occurred, try to recover wsprintf( szError, "向串口发送数据出错,错误代码: %u", dwError ) ;
MessageBox(NULL,szError,"发送数据出错",MB_ICONEXCLAMATION);
ClearCommError( IoInfoData.idComDev, &dwErrorFlags, &ComStat ) ; if (dwErrorFlags > 0) { wsprintf( szError, "向串口发送数据出错,错误代码: %u", dwError ) ;
MessageBox(NULL,szError,"发送数据出错",MB_ICONEXCLAMATION); } break; } } } else { // some other error occurred dwLength = 0 ; ClearCommError( IoInfoData.idComDev, &dwErrorFlags, &ComStat ) ; if (dwErrorFlags > 0 ) { wsprintf( szError, "向串口发送数据出错,错误代码: %u", dwErrorFlags ) ;
MessageBox(NULL,szError,"发送数据出错",MB_ICONEXCLAMATION); } } } } }
return ( dwLength ) ; }
// 把字符串转换为十六进制数据 void CSaimIO::StrToHex(unsigned char *lpBuffer, int *Total) { if(((*Total) % 2) != 0) { strcat((char *)lpBuffer,"0"); (*Total) ++; }
unsigned char HexBuffer[1024];
memset(HexBuffer,'',1024);
int i ; for( i = 0 ; i < (*Total) ; i++) { if(lpBuffer[i] > 0x39) lpBuffer[i] -= 0x37 ; else lpBuffer[i] -= 0x30 ; }
for(i=0 ; i < (*Total) ; i+=2) { HexBuffer[i/2] = lpBuffer[i] ; HexBuffer[i/2] <<= 4;
HexBuffer[i/2] |= lpBuffer[i+1]; }
memcpy(lpBuffer,HexBuffer,(*Total)/2); }
// 把十六进制数据转换为字符串 CString CSaimIO::HexToStr(unsigned char *lpDataBuffer,int Total) { CString ReturnStr; char OneNumber[5];
ReturnStr.Empty(); memset(OneNumber,0,5);
for(int i=0;i<Total;i++) { itoa(lpDataBuffer[i],OneNumber,16);
if(strlen(OneNumber) < 2) { OneNumber[2] = OneNumber[1]; OneNumber[1] = OneNumber[0]; OneNumber[0] = '0'; } ReturnStr+=OneNumber; ReturnStr+=", "; memset(OneNumber,0,5); } return ReturnStr; } // 清空串口缓冲 void CSaimIO::ClearIObuffer() { if(PurgeComm(IoInfoData.idComDev,PURGE_RXCLEAR)== 0) return ; if(PurgeComm(IoInfoData.idComDev,PURGE_TXCLEAR)== 0) return ; }
// 开始对串口监听 BOOL CSaimIO::BeginListen() { if(IoInfoData.fConnected == FALSE) return FALSE; // 判断线程是还在否运行 if(ThreadIsRun()) return TRUE;
hListenThread = CreateThread((LPSECURITY_ATTRIBUTES)NULL, 0, (LPTHREAD_START_ROUTINE)ListenThread, (LPVOID)&IoInfoData, 0,&dwThreadID);
if( hListenThread == NULL) { DWORD dwError = GetLastError(); CString Msg; Msg.Format("Error code : %d",dwError); AfxMessageBox(Msg);
return FALSE; } else { return TRUE; } }
// 停止对串口监听 BOOL CSaimIO::EndListern() { if(IoInfoData.fConnected == FALSE) return TRUE;
if( hListenThread == NULL) return TRUE;
// 判断线程是还在否运行 if(!ThreadIsRun()) return TRUE;
KillListenThread = TRUE; Sleep(100);
// 如果线程还在运行异常终止监听线程 if(!TerminateThread( hListenThread,0)) { DWORD dwError = GetLastError(); CString Msg; Msg.Format("Error code : %d",dwError); AfxMessageBox(Msg);
return FALSE; } else return CloseHandle( hListenThread );
} // 打开串口,例如:Com1,9600,n,8,1 BOOL CSaimIO::ConnectCom(LPTSTR initStr) { char strTemp[10]; int i = 3; int j = 0;
// 读出串口号 while(initStr[i] != ',' && initStr[i] != '') { strTemp[j] = initStr[i]; i++; j++; if(j > 3) return FALSE; } strTemp[j] = ''; IoInfoData.bPort = atoi(strTemp);
// 读出波特率 i++; j=0; while(initStr[i]!=',' && initStr[i] != '') { strTemp[j] = initStr[i]; i++; j++; if(j > 6) return FALSE; } strTemp[j] = '';
if(strstr(strTemp,"256000") != NULL) { IoInfoData.dwBaudRate = CBR_256000; } else if(strstr(strTemp,"128000") != NULL) { IoInfoData.dwBaudRate = CBR_128000; } else if(strstr(strTemp,"115200") != NULL) { IoInfoData.dwBaudRate = CBR_115200; } else if(strstr(strTemp,"57600") != NULL) { IoInfoData.dwBaudRate = CBR_57600; } else if(strstr(strTemp,"56000") != NULL) { IoInfoData.dwBaudRate = CBR_56000; } else if(strstr(strTemp,"38400") != NULL) { IoInfoData.dwBaudRate = CBR_38400; } else if(strstr(strTemp,"19200") != NULL) { IoInfoData.dwBaudRate = CBR_19200; } else if(strstr(strTemp,"14400") != NULL) { IoInfoData.dwBaudRate = CBR_14400; } else if(strstr(strTemp,"9600") != NULL) { IoInfoData.dwBaudRate = CBR_9600; } else if(strstr(strTemp,"4800") != NULL) { IoInfoData.dwBaudRate = CBR_4800; } else if(strstr(strTemp,"2400") != NULL) { IoInfoData.dwBaudRate = CBR_2400; } else if(strstr(strTemp,"1200") != NULL) { IoInfoData.dwBaudRate = CBR_1200; } else if(strstr(strTemp,"600") != NULL) { IoInfoData.dwBaudRate = CBR_600; } else if(strstr(strTemp,"300") != NULL) { IoInfoData.dwBaudRate = CBR_300; } else if(strstr(strTemp,"110") != NULL) { IoInfoData.dwBaudRate = CBR_110; } else { IoInfoData.dwBaudRate = CBR_9600; }
//读出校验方式 i++; strTemp[0] = initStr[i]; strTemp[1] = '';
if(strstr(strTemp,"n")!=NULL) { IoInfoData.bParity = NOPARITY ; } else if(strstr(strTemp,"e")!=NULL) { IoInfoData.bParity = EVENPARITY ; } else if(strstr(strTemp,"o")!=NULL) { IoInfoData.bParity = ODDPARITY ; } else if(strstr(strTemp,"m")!=NULL) { IoInfoData.bParity = MARKPARITY ; } else if(strstr(strTemp,"s")!=NULL) { IoInfoData.bParity = SPACEPARITY ; } else { IoInfoData.bParity = NOPARITY ; } //读出数据位数 i++; i++; strTemp[0]=initStr[i]; IoInfoData.bByteSize = atoi(strTemp);
//读出停止位 i++; j = -1; do { i++; j++; strTemp[j] = initStr[i]; }while(initStr[i] == '');
if(strstr(strTemp,"1")!=NULL) { IoInfoData.bStopBits = ONESTOPBIT ; } else if(strstr(strTemp,"2")!=NULL) { IoInfoData.bStopBits = TWOSTOPBITS ; } else if(strstr(strTemp,"1.5")!=NULL) { IoInfoData.bStopBits = ONE5STOPBITS ; } else { IoInfoData.bStopBits = ONESTOPBIT ; }
return Connect(); }
// 判断线程是还在否运行 BOOL CSaimIO::ThreadIsRun() { DWORD lpExitCode; GetExitCodeThread(hListenThread,&lpExitCode); if(lpExitCode == STILL_ACTIVE) { return TRUE; } else { return FALSE; }
} //挂起线程 void CSaimIO::SuspandThread() { ::SuspendThread(hListenThread); } //唤醒线程 void CSaimIO::ResumeThread() { ::ResumeThread(hListenThread); }
还可以到我的BLOG查看 http://blog.csdn.net/Saimen/archive/2001/10/03/10626.aspx
|