请教一个关于串口读写的问题
我需要把对串口的操作封装在com组件里,组件只对外提供一个接口函数,就是执行从外设下载数据的任务,采用的是一问一答的方式,只有我请求数据,外设才会回答数据,我原先在普通win32程序中都是使用多线程方式监控串口去读数据,但是在com组件中,外部程序只要求我的这个接口函数进行下载任务,并等待函数的返回,如果我使用线程进行监控的话,结束条件很难控制。我就使用了一个循环来完成任务
使用异步方式打开串口,然后是用同步方式读数据,异步方式写数据,读写的函数如下
int CPos::ReadComm(char *ReadBuff)
{
/*0:超时,其他:读出的数据长度
可以使用WaitCommEvent函数等待,在2000下直接返回,然后使用WaitForSignedObject
函数等待事件
改写这个函数*/
if(m_Port==NULL)
return 0;
BYTE *read=new BYTE[1024];
DWORD nByteRead,dwErrorMask,nToRead;//,dwEvtMask;
;
COMSTAT comstat;
Sleep(5);
ClearCommError(m_Port,&dwErrorMask,&comstat);
nToRead=comstat.cbInQue;
if(nToRead>0)
{
if(nToRead>1024)
nToRead=1024;
if(!ReadFile(m_Port,read,nToRead,&nByteRead,NULL))//同步读
return 0;
else
{
PurgeComm(m_Port, PURGE_TXCLEAR|PURGE_RXCLEAR);
memcpy(ReadBuff,read,nByteRead);
return nByteRead;
}
}
else
{
Sleep(1000);//等待1秒之后读
ClearCommError(m_Port,&dwErrorMask,&comstat);
nToRead=comstat.cbInQue;
if(nToRead>0)
{
if(nToRead>1024)
nToRead=1024;
if(!ReadFile(m_Port,read,nToRead,&nByteRead,NULL))
return 0;
else
{
PurgeComm(m_Port, PURGE_TXCLEAR|PURGE_RXCLEAR);
memcpy(ReadBuff,read,nByteRead);
return nByteRead;
}
}
else
return 0;
}
}