ReadFile函数是不是先足?请各位高手指点一下!焦急ing!
做串口通讯的时候,我用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值的,这没法变!那么我该怎么解决报文的读取问题呢?谢谢!
问题点数:100、回复次数:8Top
1 楼3jaja(缘来如此)回复于 2003-04-03 18:30:30 得分 0
1.你接收的数据本来就是0;
2.收到数据错误。
3.memset(lpszBlock)Top
2 楼searchcat(断尾猫)回复于 2003-04-03 18:39:30 得分 100
把串口初始化的部分帖出来Top
3 楼zhongxd(小禹)回复于 2003-04-03 19:16:54 得分 0
BOOL CComm::Create(CWnd *wndPrev,int nCom, int nBPS)
{
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;
}Top
4 楼zhongxd(小禹)回复于 2003-04-03 19:20:21 得分 0
LRESULT NEAR CreateGPSInfo(HWND hWnd,BYTE nPort,int bps)
{
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 ) ;
}
Top
5 楼searchcat(断尾猫)回复于 2003-04-03 21:19:35 得分 0
我给你查了一下,你的程序部分是抄《Window 95串口通讯函数集合(只适用于32位)》一文的,文章中的OpenConnection()创建了一个叫CommWatchProc的线程,然后这个监视COM口的进程会把收到的字符串用消息形式发送给指定的窗口。
调用ReadCommBlock的时机是通讯口事件发生的时候,你的写法可能不对。
如果照原来的机制,你不必去直接调用ReadCommBlock过程,而简单地在相应的窗口中处理消息就行了。Top
6 楼searchcat(断尾猫)回复于 2003-04-03 21:25:23 得分 0
当然你也可以自己调用ReadCommBlock,但应该先
WaitCommEvent(COMDEV(npGPSInfo),&dwEvtMask,NULL);
等待事件发生,然后
if ((dwEvtMask&EV_RXCHAR)==EV_RXCHAR)
判断是否是字符到达事件
然后再调用ReadCommBlock
但如果在主线程里这么做就会挂起,所以还是用原来的机制吧,写一个处理自定义消息的小过程就应该可以了。Top
7 楼zhongxd(小禹)回复于 2003-04-04 15:45:59 得分 0
我的程序里面希望实现查询的方式!一问一答,确保安全,用原来的机制好像不好解决吧,你有什么什么好的建议么?
Top
8 楼zhongxd(小禹)回复于 2003-04-08 21:10:34 得分 0
问题已经解决,谢谢大家,给分了!Top




