串口读不到数据
用API编写的程序,为什么串口读不到数据
BOOL CCSerialApp::OnStart()
{
// TODO: Add your command handler code here
DCB dcb;
//打开串口,得到串口句柄
hCOM=CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,
0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,NULL);
if(hCOM==INVALID_HANDLE_VALUE)
return false;
//初始化串口,READBUFFER,WRITEBUFFER是用户自己定义的
SetupComm(hCOM,1024,1024);
PurgeComm(hCOM,PURGE_TXCLEAR|PURGE_RXCLEAR);
//设置DCB参数
if(!GetCommState(hCOM,&dcb))
{
CloseHandle(hCOM);
return false;
}
dcb.BaudRate=9600;
dcb.ByteSize=8;
dcb.Parity=NOPARITY;
dcb.StopBits=ONESTOPBIT;
if(!SetCommState(hCOM,&dcb))
{
CloseHandle(hCOM);
return false;
}
//设置超时值
COMMTIMEOUTS to;
to.ReadIntervalTimeout=MAXDWORD;
to.ReadTotalTimeoutConstant=0;
to.ReadTotalTimeoutMultiplier=0;
to.WriteTotalTimeoutConstant=0;
to.WriteTotalTimeoutMultiplier=0;
if(!SetCommTimeouts(hCOM,&to))
{
CloseHandle(hCOM);
return false;
}
//初始化OVERLAPPED
memset(&overlapped,0,sizeof(OVERLAPPED));
overlapped.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
if(overlapped.hEvent==NULL)
{
AfxMessageBox("WRONG");
return false;
}
//用事件驱动方式需设置事件代码
if(!SetCommMask(hCOM,EV_RXCHAR))
{
CloseHandle(hCOM);
return false;
}
total=0;
Receive();
}
void CCSerialApp::Receive()
{
DWORD dwEvent,dwError;
DWORD nRealRead,i,dwLength;
char seq[100];
int begin;
int j;
dwEvent=dwError=0;
if(WaitCommEvent(hCOM,&dwEvent,&overlapped))
{
ClearCommError(hCOM,&dwError,&comstat);
dwLength=comstat.cbInQue;
if((dwEvent&&EV_RXCHAR)&&dwLength)
{
LPBYTE inBuffer=new BYTE[dwLength];
BOOL fReadStat=ReadFile(hCOM,inBuffer,dwLength,
&nRealRead,&overlapped);
if(!fReadStat)
{
dwError=GetLastError();
if(dwError==ERROR_IO_PENDING)
{
GetOverlappedResult(hCOM,&overlapped,&nRealRead,TRUE);
overlapped.Offset=0;
}
else
dwLength=0;
}
else
{
for(i=0;i<nRealRead;i++)
{
seq[total]=inBuffer[i];
total++;
}
}
PurgeComm(hCOM,PURGE_RXCLEAR);
delete[] inBuffer;
}
}
}