代码如下:
//先获取COM口状态
if(ClearCommError(m_COMHandle, &error, &stat) && error > 0) //清除错误
{
PurgeComm(m_COMHandle, PURGE_TXABORT | PURGE_TXCLEAR); /*清除输入缓冲区*/
return false;
}
//ClearCommError(m_COMHandle, &error, &stat);
unsigned long len = 0;
char buf[64];
len =(int)stat.cbInQue; //将缓冲区中的全部数据都取出
if (len<m_nbarCodeLen) //没有达到指定的数据长度则退出
{
return false;
}
if(!ReadFile(m_COMHandle, buf, len, &len, NULL)) //取数据失败
{
len = 0;
}
buf[len] = '\0';使用以上代码从COM口获取数据,在非线程中调用时没有任何问题,但是在线程中调用失败,每次CLEARCOMMERROR时都出现错误16,MSDN的解释是CE_BREAK The hardware detected a break condition.
请问有大虾遇到过同样的问题没有?
//先获取COM口状态
if(ClearCommError(m_COMHandle, &error, &stat) && error > 0) //清除错误
{
PurgeComm(m_COMHandle, PURGE_TXABORT | PURGE_TXCLEAR); /*清除输入缓冲区*/
return false;
}
//ClearCommError(m_COMHandle, &error, &stat);
unsigned long len = 0;
char buf[64];
len =(int)stat.cbInQue; //将缓冲区中的全部数据都取出
if (len<m_nbarCodeLen) //没有达到指定的数据长度则退出
{
return false;
}
if(!ReadFile(m_COMHandle, buf, len, &len, NULL)) //取数据失败
{
len = 0;
}
buf[len] = '\0';使用以上代码从COM口获取数据,在非线程中调用时没有任何问题,但是在线程中调用失败,每次CLEARCOMMERROR时都出现错误16,MSDN的解释是CE_BREAK The hardware detected a break condition.
请问有大虾遇到过同样的问题没有?
解决方案 »
- 关于多线程访问共享数据的瓶颈问题怎么解决?
- 当VIEW有滚动条或者并不显示完整时,如何截取View区域的位图?
- Combobox的Activex实现
- 实现多接口的问题[dual 双接口],在线等,分不够可以再加
- activex控件与com组件的区别
- VC+SQL Server 的问题,小弟先谢谢了!
- 怎样给按钮添加ICON图片(在线等)
- 我在View中的Create中创建的控件怎么在ClassWizard中的Message Map中找不到他的ID号如:IDC_LIST?
- 如何用编程的方法使CD-ROM弹出按钮失效?(用WIN32 API解决最好〕
- 如何得到当前所有打开窗口所对应的view&document类。
- 请教关于SuspendThread和ResumeThread
- 头文件的包含顺序
cpp文件
CSJYTScannerDLL::CSJYTScannerDLL()
{
//默认设置为:COM,9600,条码长度13
m_nComRate = 9600;
m_nCOM = 1;
m_nbarCodeLen=13;
m_COMHandle = INVALID_HANDLE_VALUE;
return;
}bool CSJYTScannerDLL::OpenScanner(int nCOM,long nComRate)
{
//连接条码扫描仪
char szPort[10];
m_nCOM = nCOM;
m_nComRate = nComRate;
sprintf(szPort, "COM%d", nCOM);
m_COMHandle = CreateFile(szPort, GENERIC_READ | GENERIC_WRITE, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (INVALID_HANDLE_VALUE == m_COMHandle)
{
return false;
}
//说明:关键在于初始化超时设置和设备控制设置
COMMTIMEOUTS CommtimeOuts;
memset((void*)&CommtimeOuts, 0, sizeof(CommtimeOuts));
CommtimeOuts.ReadIntervalTimeout = 0x10;
CommtimeOuts.ReadTotalTimeoutMultiplier = 1;
CommtimeOuts.ReadTotalTimeoutConstant = 1;
CommtimeOuts.WriteTotalTimeoutConstant = 1;
CommtimeOuts.WriteTotalTimeoutMultiplier = 1;//5000;
SetCommTimeouts(m_COMHandle, &CommtimeOuts);
DCB dcb;
memset((void*)&dcb, 0, sizeof(dcb));
GetCommState(m_COMHandle, &dcb);
dcb.BaudRate = m_nComRate;
dcb.ByteSize = 8;
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT;
dcb.EofChar = 0;
dcb.ErrorChar = 0;
dcb.EvtChar = 0;
dcb.fErrorChar = 0;
dcb.XoffChar = 0x13;
dcb.XonChar = 0x11;
dcb.XonLim = 2048;
dcb.XoffLim = 512;
dcb.fBinary = TRUE;
//设置超时和设备控制设置
if (!SetCommState(m_COMHandle, &dcb)
|| !SetupComm(m_COMHandle, 64, 64))
{
CloseScanner();
}
//清除所有缓冲区
PurgeComm(m_COMHandle, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT);
return true;
}bool CSJYTScannerDLL::CloseScanner()
{
//断开条码扫描仪连接
if (INVALID_HANDLE_VALUE == m_COMHandle)
{
return true;
}
PurgeComm(m_COMHandle, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT);
//关键在于关闭设备句柄
CloseHandle(m_COMHandle);
m_COMHandle = INVALID_HANDLE_VALUE;
return true;
}bool CSJYTScannerDLL::GetBarCode(char * szBarCode)
{
//memset(szBarCode,0,255);
szBarCode[0] = '\0';
COMSTAT stat;
DWORD error;
unsigned long len = 0;
char buf[64];
//先获取COM口状态 if(ClearCommError(m_COMHandle, &error, &stat) && error > 0) //清除错误
{
//PurgeComm(m_COMHandle, PURGE_TXABORT | PURGE_TXCLEAR); //清除输入缓冲区
return false;
}
//ClearCommError(m_COMHandle, &error, &stat);
len =(int)stat.cbInQue; //将缓冲区中的全部数据都取出
if (len<m_nbarCodeLen) //没有达到指定的数据长度则退出
{
return false;
} if(!ReadFile(m_COMHandle, buf, len, &len, NULL)) //取数据失败
{
len = 0;
}
buf[len] = '\0';
if (len<m_nbarCodeLen) //如果没有获取足够长的
{
return false;
}
//如果有足够长的数据则获取截取最新的一个条码长度
for (int nCount=0;nCount<m_nbarCodeLen;++nCount)
{
szBarCode[nCount]=buf[len-m_nbarCodeLen-1+nCount];
}
szBarCode[nCount]='\0';
return true;
}bool CSJYTScannerDLL::ClearComData()
{
//清除可能存在的COM缓冲区数据
if (INVALID_HANDLE_VALUE == m_COMHandle)
{
return true;
}
PurgeComm(m_COMHandle, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT);
return true;
}bool CSJYTScannerDLL::SetBarCodeLen(int len)
{
if (INVALID_HANDLE_VALUE == m_COMHandle)
{
return false;
}
m_nbarCodeLen=len;
return true;
}///H文件
class SJYTSCANNERDLL_API CSJYTScannerDLL {
public:
CSJYTScannerDLL(void); //构造函数
bool OpenScanner(int nCOM,long nComRate); //连接扫描仪
bool CloseScanner(); //断开扫描仪
bool SetBarCodeLen(int len); //设置读取的条码长度
bool GetBarCode(char * szBarCode); //获取条码
bool ClearComData(); //清除条码仪的缓冲区数据
private:
int m_nCOM; //COM端口
long m_nComRate; //COM口速率
HANDLE m_COMHandle; //COM句柄
DCB dcb; //DCB
COMMTIMEOUTS commtimeouts; //超时设置
int m_nbarCodeLen; //条码长度 //CString m_szCOM;
// TODO: add your methods here.
};
在非线程中调用正常
请各位帮帮忙看下什么地方有问题!
楼主不妨公布下问题的原因。说不定可以上FAQ赚些信誉分
也可以给大家长长见识
楼主不妨公布下问题的原因。说不定可以上FAQ赚些信誉分
也可以给大家长长见识
楼主不妨公布下问题的原因。说不定可以上FAQ赚些信誉分
也可以给大家长长见识