使用API串口直接编程,由串口调试助手发送数据,我的程序里有一个线程里反复循环读取串口数据,发现接受到的数据少了,不知道为什么啊?
串口使用的是同步方式,( 这样也能做到没有数据到达时线程堵塞)。
奇怪的是,如果我用两个串口调试助手相互通讯,发现发送的数据一个也不会少!这就排除了是线路的原因了。但是这是为什么呢?
串口使用的是同步方式,( 这样也能做到没有数据到达时线程堵塞)。
奇怪的是,如果我用两个串口调试助手相互通讯,发现发送的数据一个也不会少!这就排除了是线路的原因了。但是这是为什么呢?
解决方案 »
- 求助:如何获得浏览器正在访问的url?
- 怎样给组合框输入字符串
- CCriticalSection 的问题
- 有关定时刷新得问题?????
- 请教一个关于windowsAPI函数--GetLogicalDriveStrings获取驱动器根路径的问题
- ■请推荐一些优秀的学习vc的网站,还有可以下载vc电子书籍的网站!!■100分!
- 求救:做了个com组件,同样的设置,debug调试没有问题,release就出现如下问题:
- 怎样学好vc?
- 如何在纯DOS下编写程序使ATX关机
- 问个弱质问题,VC都用来做甚么项目,为什么满世界都招的是VB+DataServer程序员?
- 真是奇怪,内存使用越来越少,程序还能正常运行。
- 有人知道powerpoint的类名是什么吗?
[email protected]
BOOL CEasyCom::OpenPort()
{
CString strPort;
strPort.Format("COM%d",nComPort);
hCom=CreateFile(strPort,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,NULL);
if(hCom==INVALID_HANDLE_VALUE)
{
CloseHandle(hCom);
return FALSE; //打开串口失败
}
memset(&READ_OS,0,sizeof(OVERLAPPED));
memset(&WAIT_OS,0,sizeof(OVERLAPPED));
DCB dcb1;
if(!GetCommState(hCom,&dcb1))
{
CloseHandle(hCom);
return FALSE;;//读取当前com口状态
}
dcb1.BaudRate=this->dwBaudRate;
dcb1.StopBits=this->byteStopBits;//一停止位
dcb1.ByteSize=this->byteByteSize;//数据位数
dcb1.fParity=this->dwfParity;//是否允许奇偶校验
dcb1.Parity=this->byteParity;//校验
dcb1.fBinary=this->dwfBinary;//允许二进制的模式
if(!SetCommState(hCom,&dcb1))
{
CloseHandle(hCom);
return FALSE;//设置com口状态
}
if(!SetCommMask(hCom,dwComMask))
{
CloseHandle(hCom);
return FALSE;//设置响应的事件
}
if(!SetupComm(hCom,dwInQueue,dwOutQueue))
{
CloseHandle(hCom);
return FALSE;
}
// COMMTIMEOUTS对象
COMMTIMEOUTS comTimeOut;
// 接收时,两字符间最大的时延
comTimeOut.ReadIntervalTimeout = 0;
// 读取每字节的超时
comTimeOut.ReadTotalTimeoutMultiplier = 0;
// 读串口数据的固定超时
comTimeOut.ReadTotalTimeoutConstant = 0;
// 写每字节的超时
comTimeOut.WriteTotalTimeoutMultiplier = 0;
// 写串口数据的固定超时
comTimeOut.WriteTotalTimeoutConstant = 0;
// 将超时参数写入设备控制
if(!SetCommTimeouts(hCom,&comTimeOut))
{
CloseHandle(hCom);
return FALSE;
}
if(!PurgeComm(hCom,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR))
{
CloseHandle(hCom);
return FALSE;
}
WAIT_OS.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
READ_OS.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
return TRUE; //打开串口
}
CEasyCom *pEasyCom=reinterpret_cast<CEasyCom *>(lpParam);
DWORD dwEvtMask=0;
DWORD dwErrorFlags;
DWORD dwLength;
DWORD dwcase;
COMSTAT ComStat;
while(TRUE)
{
dwEvtMask=0;
WaitCommEvent(pEasyCom->hCom,&dwEvtMask,&pEasyCom->WAIT_OS);//等待事件的发生
WaitForSingleObject(pEasyCom->WAIT_OS.hEvent,INFINITE);
if((dwEvtMask&EV_RXCHAR)==EV_RXCHAR)
{
ClearCommError(pEasyCom->hCom,&dwErrorFlags,&ComStat);//得到设备当前状态!
dwLength = ComStat.cbInQue;/*得到当前收到的数据数*/
if(dwLength>0)
{
DWORD dwByteRead=0;
BOOL fRead=ReadFile(pEasyCom->hCom,pEasyCom->DataInBuff,dwLength,&dwByteRead,&pEasyCom->READ_OS);
if(!fRead)
{
dwcase=WaitForSingleObject(pEasyCom->READ_OS.hEvent,INFINITE);
}
// PurgeComm(pEasyCom->hCom,PURGE_RXCLEAR);
ResetEvent(pEasyCom->READ_OS.hEvent);
ResetEvent(pEasyCom->WAIT_OS.hEvent);
pEasyCom->pOnEasyCom(dwByteRead,pEasyCom->DataInBuff);
}
}
}