首页
社区
课程
招聘
[旧帖] 串口通信问题,CSDN上120分的贴子没人回 0.00雪花
发表于: 2011-9-12 08:07 3686

[旧帖] 串口通信问题,CSDN上120分的贴子没人回 0.00雪花

2011-9-12 08:07
3686
我做了一个pc连接扫描枪读取条码的程序,扫描枪是rs232接口的。在网上找了一些代码自己改了一点,运行的时候可以读取条码,但是超时值怎么都设不好。
我要读的数据是12位的条码。串口是以异步的方式打开的。
如果读超时设小了,一个条码有时会分两段读出来。
如果设大了,会一次读两个条码后一起显示出来。
不知道是超时的问题还是其它问题。
我网上下载了一个串口调试软件,同样的环境运行起来一点问题没有。准确率99%以上。

还有一个问题很奇怪,别人都说异步操作串口的时候ReadFile会马上返回FALSE,但在我的代码中ReadFile总是返回TRUE的。

csdn上开了两贴,都没人帮解决。只好跑到这里来求解。

DCB dcb;
        if(!m_Com.GetComState(&dcb))
        {
                MessageBox(_T("ErrorGet"));
                                return 0;
        }
        dcb.BaudRate = 9600; //波特率为9600
        dcb.ByteSize = 8;                //每个字节有8位
        dcb.Parity = NOPARITY; //无奇偶校验位
        dcb.StopBits = ONESTOPBIT; //两个停止位
        if(!m_Com.SetComState(&dcb))
        {
                DWORD dwErr = GetLastError();
                CString str;
                str.Format(_T("%d"),dwErr);
                MessageBox(str);
                                return 0;
        }

        //设定超时
        COMMTIMEOUTS TimeOuts;

        TimeOuts.ReadIntervalTimeout = MAXDWORD;
        TimeOuts.ReadTotalTimeoutMultiplier = 2;
        TimeOuts.ReadTotalTimeoutConstant = 50;
        //在读一次输入缓冲区的内容后读操作就立即返回,
        //而不管是否读入了要求的字符。

        //设定写超时
        TimeOuts.WriteTotalTimeoutMultiplier=5;
        TimeOuts.WriteTotalTimeoutConstant=200;

//............

do
{
if(!IsOpen()) return FALSE;
        HANDLE handleArr[2];

        SetEvent(m_osRead.hEvent);
        SetEvent(m_osWatch.hEvent);
        handleArr[0] = m_osRead.hEvent;
        handleArr[1] = m_osWatch.hEvent;

        COMSTAT ComStat;
        DWORD dwErrorFlags;
       
        memset(buff,'\0',nlen);
        DWORD dwBytesRead=nlen;//读取的字节数
        BOOL bReadStat;

        if(!SetCommMask(m_hCom,EV_RXCHAR))
        {
                TRACE("SetCommMask Error at %d",GetLastError());
                return FALSE;
        }

        ClearComErr(&dwErrorFlags,&ComStat);

        DWORD dwEvent = 0;
        DWORD dwResult = 0;
        DWORD dwWaitStat = WaitCommEvent(m_hCom, &dwEvent, &m_osWatch);

        if((!dwWaitStat && GetLastError() == ERROR_IO_PENDING) || dwEvent & EV_RXCHAR)
        {
                bReadStat = ReadFile(m_hCom,buff,dwBytesRead,&dwBytesRead,&m_osRead);
                if(!bReadStat)
                {
                        if(GetLastError() == ERROR_IO_PENDING)
                        {
                                GetOverlappedResult(m_hCom,&m_osRead,&dwBytesRead,TRUE);
                        }
                }
                ResetEvent(m_osRead.hEvent);
                ResetEvent(m_osWatch.hEvent);
                return TRUE;
        }
        ResetEvent(m_osRead.hEvent);
        ResetEvent(m_osWatch.hEvent);
        return FALSE;
}
while(condition)

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 878
活跃值: (496)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
你CSDN上开错地方了吧
2011-9-12 08:41
0
雪    币: 157
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
没有啊,我分两贴发的,一贴于mfc基础类,
一贴于mfc 硬件\系统类
2011-9-12 11:37
0
游客
登录 | 注册 方可回帖
返回
//