我做了一个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)
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!