精通串口的朋友看过来,100分激情放送

admireO 2002-03-18 08:05:49
根据和硬件的通信格式,我需要切换校验方式,现在的问题是,在win2000下,当切换校验方式时,需要500ms的延时(500ms是在调试的时候得出的最小延时值,否则,有数据丢失),现在的问题是,为什么会需要这种延时呢?而且,延时太长,系统不能忍受。我该怎么办?
附相关代码:
WritedNumber = WriteData( (const char*)testsend,7 + i );

Sleep(500);//这里需要延时。为什么???

dcb.Parity=3;
if(!SetCommState(m_Com,&dcb))
{
ErrorCode=0x02;
::CloseHandle(m_Com);
return FALSE;
}
testsend[0]=0xfd;
WritedNumber = WriteData( (const char*)testsend,1 );
Sleep(500);////这里需要延时,为什么???

dcb.Parity=4;
if(!SetCommState(m_Com,&dcb))
{
ErrorCode=0x02;
::CloseHandle(m_Com);
return FALSE;
}
其中:WriteData为自己写的一个向串口写数据的函数(采用重叠机制)。
...全文
51 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
FlyOverSea 2002-04-03
  • 打赏
  • 举报
回复
做个标记
admireO 2002-04-02
  • 打赏
  • 举报
回复
谢谢继续关注
lancexu 2002-04-01
  • 打赏
  • 举报
回复
按照MSDN的说法:
The SetCommState function configures a communications device according to the specifications in a device-control block (a DCB structure). The function reinitializes all hardware and control settings, but it does not empty output or input queues.

SetCommState:but it does not empty output or input queues
是不是你应该处理一下output or input queues
admireO 2002-03-31
  • 打赏
  • 举报
回复
虽然分已经给出,还是希望大家继续关注,问题还没解决
admireO 2002-03-30
  • 打赏
  • 举报
回复
to seamanhailing谢谢你的关注,其实我就是在GetOverlappedResult返回之后才改变检验方式的。但是必须Sleep(500)后,才能继续接收数据,否则就会有要接收的数据丢失,不知道是什么原因。
seamanhailing 2002-03-26
  • 打赏
  • 举报
回复
Win2k下可以用异步方式,挺好用的,不过我没有切换过校验方式。
用GetOverlappedResult判断你的程序写串口已返回后才可以改变校验方式。
admireO 2002-03-23
  • 打赏
  • 举报
回复
关注关注,为什么一定要sleep(500)呢?
admireO 2002-03-23
  • 打赏
  • 举报
回复
还有我用了::GetOverlappedResult( m_Com,&m_overlappedRead,&dwLength,TRUE )这个函数,是不是效果和WaitForSingleObject()这个函数一样?
admireO 2002-03-23
  • 打赏
  • 举报
回复
to delphihero(阿蒙)你能不能讲得详细点呀?你是说可以用WaitCommEvent()这个函数来解决这个问题吗?,还是用别的方法可以解决。
su_tong 2002-03-22
  • 打赏
  • 举报
回复
高手说:(不好意思,冒充一次,见晾见谅)
1.在win2k里以同步方式读写,肯定出问题的,我怀疑是个bug.
2.一个替代sleep的方式是用事件同步(WaitforSingleObject...),能有效的减少提高速度!
delphihero 2002-03-22
  • 打赏
  • 举报
回复
我的异步程序很正常.如果你没搞反,那我的程序就见鬼了。同步读写总要等待,即使2000下正常,也懒得用
delphihero 2002-03-22
  • 打赏
  • 举报
回复
你的是不是用事件切换来读和写数据
delphihero 2002-03-21
  • 打赏
  • 举报
回复
dysxq()搞反了.
里面没有其他等待的函数吗,如waitcommevent()
dysxq 2002-03-21
  • 打赏
  • 举报
回复
没搞反,我还是花了好多时间才找出这个问题的,试了很多次,怎么会搞反
admireO 2002-03-21
  • 打赏
  • 举报
回复
to dysxq()你搞反了吧,我在98下的程序是用同步写的,在2000下不能用,改成异步才能用,就是那个Sleep(500)有点大,无法忍受。
lizmei001 2002-03-21
  • 打赏
  • 举报
回复
关注,帮你UP
dysxq 2002-03-21
  • 打赏
  • 举报
回复
在2000里写端口最好就用同步操作,不要使用异步,我在2000里试过一次异步能写不能读,也不知道什么地方有问题,后来改成同步就什么问题也没有了
admireO 2002-03-21
  • 打赏
  • 举报
回复
请高手关注!!!!
admireO 2002-03-21
  • 打赏
  • 举报
回复
请高手关注呀,救命!!!
admireO 2002-03-19
  • 打赏
  • 举报
回复
我把我的WriteData的代码贴出来吧。
BOOL CMyCom::WriteData( const char *lpBuffer,int nLength )
{
if( m_Com == NULL )
return FALSE;
DWORD dwWritten = 0;
BOOL bRet = ::WriteFile( m_Com,lpBuffer,(DWORD)nLength,&dwWritten,&m_overlappedWrite );
if( !bRet )
{
DWORD dwErrorCode = ::GetLastError();
DWORD dwFlags = 0;
COMSTAT CommStat;
if( dwErrorCode == ERROR_IO_PENDING )
{
if( !::GetOverlappedResult( m_Com,&m_overlappedWrite,&dwWritten,TRUE ) ) //等待写操作完成
{
::ClearCommError( m_Com,&dwFlags,&CommStat );
return FALSE;
}
else
{
return TRUE;
}
}
else
{
::ClearCommError( m_Com,&dwFlags,&CommStat );
return FALSE;
}
}
else
{
return TRUE;
}
}
加载更多回复(8)

16,467

社区成员

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

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

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