串口接收数据,只能接收到一次,就再也接不到了,为什么?

simalaya 2006-09-12 09:15:57
我用EVC写了一个从串口接收数据的小代码。用事件方式从串口8中接收每五秒发过来的数据。
可是实际运行中发现,只能接收一次,就再也不继续接收数据了。请大家帮我看看到底是什么问题呢?
在类中定义如下:
//接收数据线程函数
static DWORD WINAPI ReadPortThread(LPVOID lpParameter);
HANDLE m_hReadCloseEvent; // 读线程退出事件

打开串口:

if(m_hComm==INVALID_HANDLE_VALUE)
{
m_hComm=CreateFile(TEXT("COM8:"),GENERIC_READ|GENERIC_WRITE,0,0,OPEN_EXISTING,0,0);
if(m_hComm==INVALID_HANDLE_VALUE )
{
AfxMessageBox(_T("无法打开端口!请检查是否已被占用。"));
return FALSE;
}
DCB dcb;
dcb.DCBlength = sizeof(DCB);
GetCommState(m_hComm,&dcb);
dcb.BaudRate=9600;
dcb.ByteSize=8;
dcb.Parity=NOPARITY;
dcb.StopBits=ONESTOPBIT;
dcb.fParity=FALSE;
dcb.fBinary=TRUE;
dcb.fDtrControl=0;
dcb.fRtsControl=0;
dcb.fOutX=dcb.fInX=dcb.fTXContinueOnXoff=0;

//设置状态参数
SetCommMask(m_hComm,EV_RXCHAR);
SetupComm(m_hComm,16384,16384);
if(!SetCommState(m_hComm,&dcb))
{
AfxMessageBox(_T("无法按当前参数配置端口,请检查参数!"));
PurgeComm(m_hComm,PURGE_TXCLEAR|PURGE_RXCLEAR);
ClosePort();
return FALSE;
}

//设置超时参数
COMMTIMEOUTS CommTimeOuts;
GetCommTimeouts(m_hComm,&CommTimeOuts);
CommTimeOuts.ReadIntervalTimeout=100;
CommTimeOuts.ReadTotalTimeoutMultiplier=20;
CommTimeOuts.ReadTotalTimeoutConstant=100;
CommTimeOuts.WriteTotalTimeoutMultiplier=0;
CommTimeOuts.WriteTotalTimeoutConstant=0;

if(!SetCommTimeouts(m_hComm,&CommTimeOuts))
{
AfxMessageBox(_T("无法设置超时参数!"));
PurgeComm(m_hComm,PURGE_TXCLEAR|PURGE_RXCLEAR);
ClosePort();
return FALSE;
}

PurgeComm(m_hComm,PURGE_TXCLEAR|PURGE_RXCLEAR);

m_hReadCloseEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
return TRUE;
}

return FALSE;


下面是接收数据的线程

DWORD WINAPI CPSerialPort::ReadPortThread(LPVOID lpParameter)
{

CPSerialPort *ceSeries = (CPSerialPort*)lpParameter;

DWORD evtMask;
BYTE * readBuf = NULL;//读取的字节
DWORD actualReadLen=0;//实际读取的字节数
DWORD willReadLen;

DWORD dwReadErrors;
COMSTAT cmState;

readBuf = new BYTE[256];
memset( readBuf , 0 , 256 );
//清空串口
// PurgeComm(ceSeries->m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR );

SetCommMask (ceSeries->m_hComm, EV_RXCHAR);

HANDLE hFile = CreateFile(_T("\\revlog.txt"),GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);

while (TRUE)
{
if (WaitCommEvent(ceSeries->m_hComm,&evtMask,NULL)) {

SetCommMask (ceSeries->m_hComm, EV_RXCHAR);
//表示串口收到字符
if (evtMask & EV_RXCHAR)
{

ClearCommError(ceSeries->m_hComm,&dwReadErrors,&cmState);
willReadLen = cmState.cbInQue ;
if (willReadLen <= 0)
{
continue;
}

ReadFile(ceSeries->m_hComm, readBuf, willReadLen, &actualReadLen,0);

//如果读取的数据大于0,
if (actualReadLen>0)
{
CString strTemp ;
strTemp.Format(_T(">Len:%d="),actualReadLen);
strTemp = strTemp+CString(readBuf);
DWORD a;
WriteFile(hFile,(LPCTSTR)strTemp, strTemp.GetLength()*2,&a,NULL);

//触发读取回调函数
memcpy( ceSeries->m_pFrame->cParamOne , (char*)readBuf , actualReadLen );
ceSeries->m_pFrame->iMessage = actualReadLen ;
ceSeries->m_pList->SetMessage( ceSeries->m_cBuffer );

}
Sleep(100);
}
}
//如果收到读线程退出信号,则退出线程
if (WaitForSingleObject(ceSeries->m_hReadCloseEvent,500) == WAIT_OBJECT_0)
{
break;
}
}

CloseHandle(hFile);
delete[]readBuf;
return 0;

}

运行后只能接收一次数据,就不在继续接收了,这个是什么问题呢?
...全文
1721 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
scy2510 2007-01-15
  • 打赏
  • 举报
回复
我的VS2005没遇到这样的问题
najzni 2007-01-15
  • 打赏
  • 举报
回复
up
TimCheng 2006-10-29
  • 打赏
  • 举报
回复
mark
空心兜兜 2006-09-13
  • 打赏
  • 举报
回复
学习……………………
KevinCEC 2006-09-12
  • 打赏
  • 举报
回复
WriteFile(hFile,(LPCTSTR)strTemp, strTemp.GetLength()*2,&a,NULL);
为什么要*2呢?
elson_hao 2006-09-12
  • 打赏
  • 举报
回复
貌似某本书上的代码,调试一下吧
simalaya 2006-09-12
  • 打赏
  • 举报
回复
WINCE下是宽字节

19,502

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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