首页
社区
课程
招聘
[旧帖] [求助]串口程序,dbug版本没问题,release版本出现问题 0.00雪花
发表于: 2012-3-22 09:45 1675

[旧帖] [求助]串口程序,dbug版本没问题,release版本出现问题 0.00雪花

2012-3-22 09:45
1675
我用vc6.0的MFC做了个串口程序,dbug版本没问题,但编译成release版本后接收和发送都报错,说某块内存不能为read

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (17)
雪    币: 238
活跃值: (55)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
2
OD的初衷可不是为了破解,大家包括我在内在程序出错的时候都有个误区都想不起来用OD!
2012-3-22 10:34
0
雪    币: 44
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
麻烦楼上能说的详细些吗,我不太懂。
2012-3-22 11:06
0
雪    币: 238
活跃值: (55)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
4
就是说用ollyice进行调试,这是调试软件最根本的使命,但现在一提到OD好像就直接想起了破解,而一到程序crash的时候却想不起来用它,这不得不引起我们的反思
2012-3-22 11:07
0
雪    币: 44
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
我把接收代码注释掉,就不报错,我感觉是我的接收和发送代码有问题,麻烦大家帮小弟看一下
//发送
void C_ControlMatrix::SendData(BYTE data) 
{
    DWORD dwError;   
    DWORD dwRealSend = 0; 

    //WaitForSingleObject(m_HMutex,INFINITE);
    if (ClearCommError(m_HCom,&dwError,NULL))  
    {  
        PurgeComm(m_HCom,PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);    //清干净输入、输出缓冲区
    }  

    if (!WriteFile(m_HCom,(VOID*)&data,1,&dwRealSend,&m_WriteOverlapped))  
    {  
        if (GetLastError() == ERROR_IO_PENDING)  
        {  
            while (!GetOverlappedResult(m_HCom,&m_WriteOverlapped,&dwRealSend,FALSE))  
            {  
                if (GetLastError() == ERROR_IO_INCOMPLETE)  
                {  
                    //cout<<"写未完成,继续!"<  
                    continue;  
                }  
                else 
                {  
                    //cout<<"发生错误,尝试恢复!"<  
                    ClearCommError(m_HCom,&dwError,NULL);  
                    break;  
                }  
            }  
        }  
    }
    //ReleaseMutex(m_HMutex);
}
//接收
int C_ControlMatrix::RecveData(char* pReadBuf)
{
    OVERLAPPED os;
    DWORD dwError;  
    DWORD dwErrorFlags; 
    DWORD dwCommStatus=0;
    DWORD dwWantRead = CHANNELCOUNT_16;  
    DWORD dwRealRead = 0;  
    
    memset(&os,0,sizeof(OVERLAPPED));
    os.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
    if (os.hEvent==NULL)
    {
        return -1;
    }
    
    //WaitForSingleObject(m_HMutex,INFINITE);
    if(m_HCom!=NULL)
    {
        SetCommMask(m_HCom,EV_RXCHAR|EV_TXEMPTY);//有哪些串口事件需要监视
        WaitCommEvent(m_HCom,&dwCommStatus,&os);
        //检测返回的dwCommStatus,了解发生了什么串口事件
        if ((dwCommStatus & EV_RXCHAR)==EV_RXCHAR)//缓冲区中有数据到达
        {
            COMSTAT ComStat;
            DWORD dwLength=0;
            ClearCommError(m_HCom,&dwErrorFlags,&ComStat);
            dwLength=ComStat.cbInQue;    //输入缓冲区有多少数据
            if (dwLength>0)
            {
                BOOL fReadStat;
                fReadStat=ReadFile(m_HCom,pReadBuf,dwWantRead,&dwRealRead,&m_ReadOverLapped);
                pReadBuf[dwRealRead]='\0';
                if (!fReadStat)
                {
                    if (GetLastError()==ERROR_IO_PENDING)
                    {
                        while(!GetOverlappedResult(m_HCom,&m_ReadOverLapped,&dwRealRead,TRUE))
                        {
                            dwError = GetLastError();
                            if (dwError==ERROR_IO_INCOMPLETE)
                            {
                                continue;
                            }
                        }
                    }
                }
            }
            //ReleaseMutex(m_HMutex);
            CloseHandle(os.hEvent);
            return dwRealRead;
        }
    }
    //ReleaseMutex(m_HMutex);
    CloseHandle(os.hEvent);
    return 0;
}
2012-3-22 11:13
0
雪    币: 2105
活跃值: (424)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
一般Debug没事 Release崩掉的 都是因为缓冲区溢出。
2012-3-22 11:16
0
雪    币: 238
活跃值: (55)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
7
高手出现,果然经验老道,我也有了收获
2012-3-22 11:19
0
雪    币: 238
活跃值: (55)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
8
楼主用od作为默认调试器,查看一下崩溃时的调用堆栈,可以迅速发现问题,不知道我说的对不对
2012-3-22 11:21
0
雪    币: 44
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9

我还是个新手,不会用od
2012-3-22 12:53
0
雪    币: 458
活跃值: (421)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
10
fReadStat=ReadFile(m_HCom,pReadBuf,dwWantRead,&dwRealRead,&m_ReadOverLapped);
                pReadBuf[dwRealRead]='\0';

仔细想一下。。。
2012-3-22 13:21
0
雪    币: 58
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
我是来学习的,看大牛们的高见
2012-3-22 13:26
0
雪    币: 615
活跃值: (172)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
12
上传代码或者发到我邮箱吧,帮你搞定........... 我邮箱:qinrh#foxmail.com (#换成@)
2012-3-22 14:11
0
雪    币: 44
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
非常感谢大家的关注,问题还是没有解决
我把接收函数里面的 os相关定义和创建去掉
又把WaitCommEvent(m_HCom,&dwCommStatus,&os);中os换成m_ReadOverLapped不报错,但接收不到数据了。
2012-3-22 15:13
0
雪    币: 44
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
我也检查了,所有变量都正常初始化了
求解答
2012-3-22 16:09
0
雪    币: 238
活跃值: (55)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
15
态度还是不诚恳,既不上代码也不传程序,我们无能为力
2012-3-22 19:54
0
雪    币: 44
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
谢谢各位的关注,小弟已经解决了。
不是我不愿意上代码,是不能多上代码,公司有规定,抱歉了各位。
2012-3-23 11:42
0
雪    币: 28
活跃值: (55)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
太难了,看不懂
2012-3-23 11:48
0
雪    币: 238
活跃值: (55)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
18
一开始你说是自己编的,也没提到公司。公司规定大家理解,但是问题出在何处,最终怎么解决的,楼主也没说啊,不结贴可不是好习惯
2012-3-23 11:48
0
游客
登录 | 注册 方可回帖
返回
//