串口读不到数据

helenhll 2003-10-31 04:33:51
用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;
}
}

}
...全文
43 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
helenhll 2003-11-01
  • 打赏
  • 举报
回复
一定要用多线程吗?
不是可以用单线程的吗?
nuaawenlin 2003-10-31
  • 打赏
  • 举报
回复
因为你的Receive();
函数只执行了一次
使用多线程
helenhll 2003-10-31
  • 打赏
  • 举报
回复
我用的是事件驱动,不用WaitCommEvent还能用什么?
如果我把WaitCommEvent的第三个参数改成NULL就可以接收了,但是只接收一部分
yanxing 2003-10-31
  • 打赏
  • 举报
回复
有以下疑惑,不敢肯定是这些原因

1,超时都为0,可以吗?只是疑惑,我不知道可不可以,但是我没设置成0试过,
2,接收函数中只用WaitCommEvent可以吗?

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧