专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > 嵌入开发

PC通过串口读取rs232条码扫描枪扫描的条码有关问题

发布时间:2010-06-13 21:49:12 文章来源:www.iduyao.cn 采编人员:星星草
PC通过串口读取rs232条码扫描枪扫描的条码问题
底存实际传输我不太懂,从网上找了一些代码,自己试验了一下,可以读出来,是用的异步读取模式,但现在有一个问题,我重复扫描相同条码100次,会有20到30次读取不准,发生截断,一个条码作两次读出来。

直接上代码,
我用的是COM1口,基本设置如下:
dcb.BaudRate = 9600; //波特率为9600
dcb.ByteSize = 8; //每个字节有8位
dcb.Parity = NOPARITY; //无奇偶校验位
dcb.StopBits = ONESTOPBIT; //一个停止位

//设定超时
COMMTIMEOUTS TimeOuts;

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

//设定写超时
TimeOuts.WriteTotalTimeoutMultiplier=50;
TimeOuts.WriteTotalTimeoutConstant=5000;

读取代码
C/C++ code

UINT __cdecl OnWatchCom(LPVOID lparam)
{
    CBillDlg *pDlg = (CBillDlg *)lparam;
    if(pDlg == NULL) return -1;
    CString strResult;
    char buff[128] = {0};
    while(pDlg->m_IsWatching)
    {
        if(pDlg->m_Com.ReadCom(buff,128,2000))
        {
            pDlg->m_Com.ClearComBuf(PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
            strResult.Format(_T("%s"),buff);
            if(!strResult.IsEmpty())
            {
                pDlg->m_strBillNo = strResult;
                pDlg->UpdateData(0);        
            }
        }
        Sleep(50);
    }
    return 0;
}
BOOL CComport::ReadCom(char *buff, int nlen, int dwMiniTimeout)
{
    if(!IsOpen()) return FALSE;
    OVERLAPPED m_osRead;
    memset(&m_osRead,0,sizeof(OVERLAPPED));
    m_osRead.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);

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

    ClearComErr(&dwErrorFlags,&ComStat);
    dwBytesRead=min(dwBytesRead, (DWORD)ComStat.cbInQue);
    bReadStat=ReadFile(m_hCom,buff,dwBytesRead,&dwBytesRead,&m_osRead);
    if(!bReadStat)
    {
        if(GetLastError()==ERROR_IO_PENDING)//GetLastError()函数返回ERROR_IO_PENDING,表明串口正在进行读操作
        {
            //GetOverlappedResult(m_hCom,&m_osRead,&dwBytesRead,TRUE);
            WaitForSingleObject(m_osRead.hEvent,dwMiniTimeout);
            //使用WaitForSingleObject函数等待,直到读操作完成或延时已达到2秒钟
            //当串口读操作进行完毕后,m_osRead的hEvent事件会变为有信号
            //ResetEvent(m_osRead.hEvent);
        }
    }
    CloseHandle(m_osRead.hEvent);
    return TRUE;
}



不知道是读函数的问题还是超时设置的问题,我的条码是12位数字,网上写的大多数超时方式我都试过。可还是没什么效果.请指教

------解决方案--------------------
最好专门开个线程来读数据,读到数据之后通过回调函数或者事件通知的方式,让应用程序取数据,个人意见。。
------解决方案--------------------
这儿有一个参考,写法和楼主用的方法一样
http://www.vckbase.com/document/viewdoc/?id=1734
------解决方案--------------------
路过拾点什么……
------解决方案--------------------
找个串口类,很简单。
要是读出半截来,你就把类中的sleep参数设大点。
见过几个串口操作的类,其中都有sleep
------解决方案--------------------
探讨
其实同步读取可以完成任务,我就是想知道异步读取怎么做。

------解决方案--------------------
你该做一个内存缓冲 来保存你读取的数据 然后检查数据的完整性

还有就是在线程里面不要 pDlg->UpdateData(0);
------解决方案--------------------
两个小问题
ClearComErr(&dwErrorFlags,&ComStat);之后判断一下ComStat.cbInQue 是否为零
WaitForSingleObject(m_osRead.hEvent,-1);最好GetOverlappedResult代替 并且无限等待


------解决方案--------------------
晕了 看了你的代码跟着你的思维走了

现在才发现你的架构有问题

应该是下面的步骤
1 CreateFile

2 SetCommMask注册读事件
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: