串口通讯问题!大侠请进。谢谢 ( 积分: 100 )

  • 主题发起人 主题发起人 chgangly
  • 开始时间 开始时间
C

chgangly

Unregistered / Unconfirmed
GUEST, unregistred user!
我利用API串口进行通讯,上位机下发5个字节,下位机收到后上发5个字节。我在for循环中用WriteFile分5此发送这5个字节,然后不断地查询用API函数ClearCommError(hComm,dwCommError,@CS)取到的cs.cbInQue
值,若cs.cbInQue=5马上用Readfile接收。可是收发的速度很慢,甚至赶不上用mscom。如果采用汇编的方法操作串口,每次收发7毫秒,而我用API却要近11毫秒,请问怎样改进才能将每次收发事件减少到8毫秒左右??(波特率已定)
 
我利用API串口进行通讯,上位机下发5个字节,下位机收到后上发5个字节。我在for循环中用WriteFile分5此发送这5个字节,然后不断地查询用API函数ClearCommError(hComm,dwCommError,@CS)取到的cs.cbInQue
值,若cs.cbInQue=5马上用Readfile接收。可是收发的速度很慢,甚至赶不上用mscom。如果采用汇编的方法操作串口,每次收发7毫秒,而我用API却要近11毫秒,请问怎样改进才能将每次收发事件减少到8毫秒左右??(波特率已定)
 
>>后不断地查询用API函数ClearCommError(hComm,dwCommError,@CS)取到的cs.cbInQue值
估计是这里这个不断的循环消耗了大量的CPU时间,应该考虑使用异步读写方式读写,具体可以参考一下SPCOMM控件的源代码,它是使用异步读写的
 
thx1180, 异步读写是有它的有点,我现在采用同步实现5个字节的下发和上发,都要近11毫秒,那采用异步的时间应该会要得更多。
 
我觉得楼主可能对异步读写操作有些误解了,使用异步操作方式尤其是在读的时候更能体现它的优势:它是靠在串口有数据进来时触发读操作的——就象在DOS下面的中断响应一样,你可以不必弄一个循环去检测有没有数据
 
我曾用线程在同步方式下检测数据,相邻两次读的时间大概在1ms以内,呵呵,楼主不妨参考一下线程模式。
楼上说得不错,异步模式在读的时候很有优势,你甚至可以设置仅在读到5个字节的时候触发。
 
如果对时间不苛刻的话用异步吧,读写都非常简单
 
nicai_wgl,那同步或者异步哪种每次读写的时间消耗最少呢?
 
异步读,中断方式,就不存在时间消耗的问题,除了读本身所占用的指令时间
 
用洗衣机打个比方,有一堆衣服要洗,一次只能洗一件:
同步方式:人等在洗衣机边,洗完一件晾一件,只要你的检查的间隔足够细,可以在最短的时间内把洗好的衣服晾起来。缺点:太耗费体力(资源),特别是大批量衣服(数据)要处理的时候。
异步方式:让衣服自动洗并设置了两个措施,1、衣服洗完了自动提醒(事件),2、定了洗衣总时间,时间到了如果还没洗完的话就报错。优点:节省体力,方便。缺点:衣服少时会有点浪费时间。
 
多人接受答案了。
 
后退
顶部