请串口通讯高手帮忙

yjinf 2005-05-24 11:58:54
BOOL bWrite = pComPort->WriteCommBlock(ReadCmd,4);
Sleep(0);
if(bWrite)
{
WaitCommEvent( COMDEV( pComPort->m_pCOMInfo ), &dwEvtMask, NULL/*&ol*/ );

Sleep(0);
if ((dwEvtMask & EV_RXCHAR) == EV_RXCHAR)
{
do
{
if(nLength = pComPort->ReadCommBlock((LPSTR)abIn+nLength, MAXBLOCK))
{
dwReadSize += nLength;
}
}while(nLength > 0);

if(dwReadSize > 0)
pComPort->WriteDisdata(abIn,dwReadSize);
}
}


pComPort是串口通讯类的实例,这段代码放在一个while循环中,除非进程退出否则一直在运行。
因为我是在测试,所以串口是2、3接在一起,我往串口写入52 30 31 0D,共四个字节,读出来的应该也是这四个字节,但实际读出来的是52 30 31 0D 52 30 31 0D 共8个字节,数据好像被重复了一遍。如果我将读取数据延时改为Sleep(1),数据读取就正确了,但这样每秒读写的次数就减少了。我不明白为什么会读出双份的数据?
...全文
114 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
yjinf 2005-05-26
  • 打赏
  • 举报
回复
ReadCommBlock的实现,主要是根据VC自带的例子做的,请帮我看看.

fReadStat = ReadFile( COMDEV( m_pCOMInfo ), lpszBlock,
dwLength, &dwLength, &READ_OS( m_pCOMInfo ) ) ;
if (!fReadStat)
{
if (GetLastError() == ERROR_IO_PENDING)
{
TRACE("\n\rIO Pending");
// We have to wait for read to complete.
// This function will timeout according to the
// CommTimeOuts.ReadTotalTimeoutConstant variable
// Every time it times out, check for port errors
while(!GetOverlappedResult( COMDEV( m_pCOMInfo ),
&READ_OS( m_pCOMInfo ), &dwLength, TRUE ))
{
dwError = GetLastError();
if(dwError == ERROR_IO_INCOMPLETE)
// normal result if not finished
continue;
else
{ // an error occurred, try to recover
sprintf( szError, "<CE-%u>", dwError ) ;
ClearCommError( COMDEV( m_pCOMInfo ), &dwErrorFlags, &ComStat ) ;
break;
}
}
}
else
{ // some other error occurred
dwLength = 0 ;
ClearCommError( COMDEV( m_pCOMInfo ), &dwErrorFlags, &ComStat ) ;
}
}
cqpp 2005-05-24
  • 打赏
  • 举报
回复
要看你那个ReadCommBlock是如何实现的!感觉你这个有点怪

2,643

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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