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;
读取代码
不知道是读函数的问题还是超时设置的问题,我的条码是12位数字,网上写的大多数超时方式我都试过。可还是没什么效果.请指教
直接上代码,
我用的是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;
读取代码
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位数字,网上写的大多数超时方式我都试过。可还是没什么效果.请指教
...全文
相关推荐
台达PLC阅读条码扫描枪程序应用.pdf
采用低成本PLC,接收条码枪收入。PLC可以处理生产线逻辑也同时接收扫描枪信息输入。条码枪已经很广泛用于生产线。
霍尼韦尔3310g扫描枪快速入门:配置、部署与故障排查指南
条码扫描枪是现代仓储物流与零售收银中不可或缺的数据采集工具,其通过激光或影像技术读取一维码信息,并借助USB-HID等接口模式实现即插即用。理解设备的基本工作原理与参数配置,是保障高效稳定运行的关键。霍尼韦尔3310g作为一款经典的一维条码扫描枪,支持通过扫描配置码快速调整蜂鸣器音量、数据后缀、码制开关等参数,也可使用DataGrid软件进行批量设置与固件升级。在实际应用中,无论是POS收银、仓库盘点还是电子屏幕码识别,掌握接口模式选择、反光处理技巧及常见故障排查方法,都能显著提升工作效率。本文从基础概念出
PC端二维条码扫描软件-QuickMark
PC端二维码查看软件,摄像头可以扫描到相应的二维条码,包括一维条码.
PC电脑扫描枪串口数据自动中文解码到焦点位置.rar
条码扫描枪串口接收数据输出到焦点位置的插件,支持条码英文及中文GB2312和UTF8编码,且自动判断编码,可以配置串口COM名称和波特率。
C#使用RS232串口通讯示例
完整的RS232串口通讯示例


其他硬件开发
