做串口通讯的时候,我用ReadFile()读取串口,代码如下
int NEAR ReadCommBlock(LPSTR lpszBlock,int nMaxLength)
{//
if (!g_GPSInfo) return FALSE;
BOOL fReadStat ;
COMSTAT ComStat ;
DWORD dwErrorFlags;
DWORD dwLength;
DWORD dwError; ClearCommError(COMDEV(g_GPSInfo),&dwErrorFlags,&ComStat);
dwLength=min((DWORD)nMaxLength,ComStat.cbInQue); if (dwLength>0){
fReadStat=ReadFile(COMDEV (g_GPSInfo),lpszBlock,dwLength,&dwLength,&READ_OS(g_GPSInfo));
if (!fReadStat){
if (GetLastError()==ERROR_IO_PENDING){
OutputDebugString("\n\rIO Pending");
while(!GetOverlappedResult(COMDEV(g_GPSInfo),&READ_OS(g_GPSInfo),&dwLength,TRUE)){
dwError=GetLastError();
if(dwError == ERROR_IO_INCOMPLETE)
continue;
}
}else{
dwLength=0;
ClearCommError(COMDE(g_GPSInfo),&dwErrorFlags,&ComStat);
}
}
}
return dwLength ;
} 当我用它读取缓冲的时候,缓冲的第一个值为0时,转换成字符刚好是‘\0’,
那么返回的指针指向的值显示为空,如果读的正确的化 lpszBlock[3]
因该有正确的值,结果,指针后面的值都是一些随机值,这肯定就不对,是不是ReadFile函数内部用了一些字符串操作的函数比如strcpy而造成这样的错误呢?大伙帮我看一下,给点意见,我弄得报文里面是一定有0值的,这没法变!那么我该怎么解决报文的读取问题呢?谢谢!
int NEAR ReadCommBlock(LPSTR lpszBlock,int nMaxLength)
{//
if (!g_GPSInfo) return FALSE;
BOOL fReadStat ;
COMSTAT ComStat ;
DWORD dwErrorFlags;
DWORD dwLength;
DWORD dwError; ClearCommError(COMDEV(g_GPSInfo),&dwErrorFlags,&ComStat);
dwLength=min((DWORD)nMaxLength,ComStat.cbInQue); if (dwLength>0){
fReadStat=ReadFile(COMDEV (g_GPSInfo),lpszBlock,dwLength,&dwLength,&READ_OS(g_GPSInfo));
if (!fReadStat){
if (GetLastError()==ERROR_IO_PENDING){
OutputDebugString("\n\rIO Pending");
while(!GetOverlappedResult(COMDEV(g_GPSInfo),&READ_OS(g_GPSInfo),&dwLength,TRUE)){
dwError=GetLastError();
if(dwError == ERROR_IO_INCOMPLETE)
continue;
}
}else{
dwLength=0;
ClearCommError(COMDE(g_GPSInfo),&dwErrorFlags,&ComStat);
}
}
}
return dwLength ;
} 当我用它读取缓冲的时候,缓冲的第一个值为0时,转换成字符刚好是‘\0’,
那么返回的指针指向的值显示为空,如果读的正确的化 lpszBlock[3]
因该有正确的值,结果,指针后面的值都是一些随机值,这肯定就不对,是不是ReadFile函数内部用了一些字符串操作的函数比如strcpy而造成这样的错误呢?大伙帮我看一下,给点意见,我弄得报文里面是一定有0值的,这没法变!那么我该怎么解决报文的读取问题呢?谢谢!
2.收到数据错误。
3.memset(lpszBlock)
{
m_nPort=nCom; m_nBPS=nBPS;
RECT rect={0,0,10,10};
Create(NULL,"XHComm",WS_OVERLAPPED, rect, wndPrev,1000, NULL) ;
return TRUE;
}
BOOL CComm::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext)
{
BOOL ret=CWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);
for(int i=1;i<=2;i++){
DestroyGPSInfo();
m_nPort=i;
if(!CreateGPSInfo(m_hWnd,m_nPort,m_nBPS)){ MessageBox("COM init fail!","Error");
return FALSE;
}
if(OpenConnection()){ return true;
}
}
return ret;
}
{
if (NULL==(g_GPSInfo=(PGPSINFO)LocalAlloc(LPTR,sizeof(GPSINFO))))
return ((LRESULT)-1) ;
g_hGPSWnd=hWnd;
COMDEV(g_GPSInfo)=0;
CONNECTED(g_GPSInfo)=FALSE;
PORT(g_GPSInfo)=nPort;
BAUDRATE(g_GPSInfo)=bps;
BYTESIZE(g_GPSInfo)=8;
PARITY(g_GPSInfo)=NOPARITY;
STOPBITS(g_GPSInfo)=ONESTOPBIT;
WRITE_OS(g_GPSInfo).Offset=0;
WRITE_OS(g_GPSInfo).OffsetHigh=0;
READ_OS(g_GPSInfo).Offset=0;
READ_OS(g_GPSInfo).OffsetHigh=0;
// create I/O event used for overlapped reads / writes
READ_OS(g_GPSInfo).hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
if (READ_OS(g_GPSInfo).hEvent==NULL)
{
LocalFree( g_GPSInfo ) ;
return ( -1 ) ;
}
WRITE_OS(g_GPSInfo).hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
if (NULL==WRITE_OS(g_GPSInfo).hEvent)
{
CloseHandle(READ_OS(g_GPSInfo).hEvent);
LocalFree(g_GPSInfo) ;
return (-1) ;
}
return ( (LRESULT) TRUE ) ;
}
WaitCommEvent(COMDEV(npGPSInfo),&dwEvtMask,NULL);
等待事件发生,然后
if ((dwEvtMask&EV_RXCHAR)==EV_RXCHAR)
判断是否是字符到达事件
然后再调用ReadCommBlock
但如果在主线程里这么做就会挂起,所以还是用原来的机制吧,写一个处理自定义消息的小过程就应该可以了。