往串口写数据出现问题 我执行WriteFile写串口的时候失败,GetLastError()返回错误23------数据错误 (循环冗余检查)。 请问产生的原因是什么?产生这个错误以后我的串口似乎就不能写了,怎么样去掉这个错误?thanks! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这是我写的串口类中的一部分:HANDLE m_hComDev;// 串口设备句柄 OVERLAPPED m_osRead,m_osWrite;//头文件中如此定义int CRs232::WriteCommBlock( LPCVOID lpByte, UINT nBytesToWrite)//向串口发送数据{ int e_NotConnected =0; int e_TransmitError =0; int e_TransmitNotFinished =0; DWORD dwBytesWritten, dwErrorFlags; COMSTAT ComStat; if( !m_bConnected ) // 串口没有打开 return e_NotConnected; if(WaitForSingleObject(m_osWrite.hEvent,0) != WAIT_OBJECT_0) return e_TransmitNotFinished; ResetEvent(m_osWrite.hEvent); if(!WriteFile(m_hComDev,lpByte,nBytesToWrite,&dwBytesWritten,&m_osWrite)) { // 往串口发送数据 if( GetLastError() == ERROR_IO_PENDING ) return 0; // 正在后台发送 ClearCommError( m_hComDev, &dwErrorFlags, &ComStat ) ; // 出现错误,清除错误标志 return e_TransmitError; // 发送出错 } return 0; // WriteFile返回1,发送成功}} 谢谢楼上,我没有使用overlap读写,不知道这样对不对BOOL CSerial::Write(BYTE *pBuf, DWORD dwLen, DWORD *pWritten){ if(m_hCom == INVALID_HANDLE_VALUE)return FALSE; int nRet = WriteFile(m_hCom, (void *)pBuf, dwLen, pWritten, NULL); if(nRet != 0) return TRUE; Sleep(500); int err = GetLastError(); //返回23 return FALSE;} 这样作个例子吧:unsigned short gcWriteCommBlock( HANDLE portID, unsigned char *lpBuf, int *len ){ DWORD tlen; if( portID == INVALID_HANDLE_VALUE ) return CER_NOOPEN; // 串口未打开 PurgeComm( portID, PURGE_TXABORT | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_RXCLEAR ); // 清除输入输出缓冲BUF if( !WriteFile( portID, lpBuf, *len, &tlen, NULL ) ) { PurgeComm( portID, PURGE_TXABORT | PURGE_TXCLEAR ); *len = 0; return CER_COMMUNICATE; // 通讯错误 } if( tlen < (DWORD)(*len) ) { PurgeComm( portID, PURGE_TXABORT | PURGE_TXCLEAR ); *len = tlen; return CER_READERTIMEOUT; // Time out } return 0;} 我使用while(1)循环不停的WriteFile,没有WaitForSingleObject,是不是不行啊? 郁闷,今天执行SetupComm的时候GetLastError()总返回23 这里,执行到SetCommState的时候出现错误,help, thanksDCB m_dcb; if (!(bRet = GetCommState(m_hCom, &m_dcb))) return FALSE; m_dcb.BaudRate = nBaudRate; m_dcb.fBinary = 1; m_dcb.fParity = 0; m_dcb.fOutxCtsFlow = 0; m_dcb.fOutxDsrFlow = 0; m_dcb.fDtrControl = DTR_CONTROL_ENABLE; m_dcb.fDsrSensitivity = 0; m_dcb.fTXContinueOnXoff = 1; m_dcb.fOutX = 0; m_dcb.fInX = 0; m_dcb.ErrorChar = 0; m_dcb.fNull = 0; m_dcb.fRtsControl = RTS_CONTROL_ENABLE; m_dcb.fAbortOnError = 1; m_dcb.fDummy2 = 0; m_dcb.ByteSize = nDataSize; m_dcb.Parity = nParity; m_dcb.StopBits = nStopBit; bRet = SetCommState(m_hCom, &m_dcb); 郁闷,现在发现GetCommState后马上SetCommState就会出现错误(不修改m_dcb),不知道为什么了 老兄;咱两个是难友阿!咱两个的问题是一样的,不过有人建议用setcomtimesout试试,明天我试试看有没有结果。 SetCommTimeouts我试过可以,我的问题解决了 qq找茬截图 谁有EXCEL OLE对象操作的帮助文档啊? xml是纯文本吗?可以保存二进制信息吗?如果不能存二进制,为什么说新版的office是用xml格式保存的呢? hash_map 初始化大小问题, 就是桶的个数 大家帮我看看这个错误咋解决? <windows程序设计>第五版,第二问 高分请教图象采集实时显示问题! 请教,这句话该如何理解?谢谢! installshield中如何显示带有yes和no的对话框? 请教这个opengl的程序哪里出了错 HTTP代理 即时通讯 继续解决:VC8(VS2005)编写的C++程序在客户机上运行的条件
HANDLE m_hComDev;// 串口设备句柄
OVERLAPPED m_osRead,m_osWrite;//头文件中如此定义
int CRs232::WriteCommBlock( LPCVOID lpByte, UINT nBytesToWrite)//向串口发送数据
{
int e_NotConnected =0;
int e_TransmitError =0;
int e_TransmitNotFinished =0;
DWORD dwBytesWritten, dwErrorFlags;
COMSTAT ComStat;
if( !m_bConnected ) // 串口没有打开
return e_NotConnected;
if(WaitForSingleObject(m_osWrite.hEvent,0) != WAIT_OBJECT_0)
return e_TransmitNotFinished;
ResetEvent(m_osWrite.hEvent);
if(!WriteFile(m_hComDev,lpByte,nBytesToWrite,&dwBytesWritten,&m_osWrite))
{
// 往串口发送数据
if( GetLastError() == ERROR_IO_PENDING )
return 0; // 正在后台发送
ClearCommError( m_hComDev, &dwErrorFlags, &ComStat ) ; // 出现错误,清除错误标志
return e_TransmitError; // 发送出错
}
return 0; // WriteFile返回1,发送成功}
}
BOOL CSerial::Write(BYTE *pBuf, DWORD dwLen, DWORD *pWritten)
{
if(m_hCom == INVALID_HANDLE_VALUE)return FALSE;
int nRet = WriteFile(m_hCom, (void *)pBuf, dwLen, pWritten, NULL);
if(nRet != 0)
return TRUE; Sleep(500);
int err = GetLastError(); //返回23 return FALSE;
}
unsigned short gcWriteCommBlock( HANDLE portID, unsigned char *lpBuf, int *len )
{
DWORD tlen; if( portID == INVALID_HANDLE_VALUE )
return CER_NOOPEN; // 串口未打开 PurgeComm( portID,
PURGE_TXABORT | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_RXCLEAR ); // 清除输入输出缓冲BUF
if( !WriteFile( portID, lpBuf, *len, &tlen, NULL ) )
{
PurgeComm( portID, PURGE_TXABORT | PURGE_TXCLEAR );
*len = 0;
return CER_COMMUNICATE; // 通讯错误
} if( tlen < (DWORD)(*len) )
{
PurgeComm( portID, PURGE_TXABORT | PURGE_TXCLEAR );
*len = tlen;
return CER_READERTIMEOUT; // Time out
}
return 0;
}
DCB m_dcb;
if (!(bRet = GetCommState(m_hCom, &m_dcb)))
return FALSE; m_dcb.BaudRate = nBaudRate;
m_dcb.fBinary = 1;
m_dcb.fParity = 0;
m_dcb.fOutxCtsFlow = 0;
m_dcb.fOutxDsrFlow = 0;
m_dcb.fDtrControl = DTR_CONTROL_ENABLE;
m_dcb.fDsrSensitivity = 0;
m_dcb.fTXContinueOnXoff = 1;
m_dcb.fOutX = 0;
m_dcb.fInX = 0;
m_dcb.ErrorChar = 0;
m_dcb.fNull = 0;
m_dcb.fRtsControl = RTS_CONTROL_ENABLE;
m_dcb.fAbortOnError = 1;
m_dcb.fDummy2 = 0;
m_dcb.ByteSize = nDataSize;
m_dcb.Parity = nParity;
m_dcb.StopBits = nStopBit;
bRet = SetCommState(m_hCom, &m_dcb);
咱两个的问题是一样的,不过有人建议用setcomtimesout试试,明天我试试看有没有结果。