讨论delphi中串口通信(50分)

  • 主题发起人 主题发起人 loner_meme
  • 开始时间 开始时间
L

loner_meme

Unregistered / Unconfirmed
GUEST, unregistred user!
本人目前使用Delphi的SPCOMM控件对串口进行读写。
有两点体会或问题。
1-在运用过程中,发现该控件没有对串口读写的超时进行控制。(或本人愚笨没发现)
故本人是用时间控件对串口的读写超时进行控制。
2-在串口操作中,数据会丢包,但也不是经常,故本人用延时进行控制,问题基本解决。
不知道我遇到的问题与解决方法是否正确、合理?
想听听在大家伙对串口编程的经验和体会。
如有兴趣可加我QQ76135178进行详谈,或发邮件LONER_MEME@163.com
 
共同学习.
 
本来就没有延时的功能嘛,时间控件的时间不准,自己用getticketcount的时间才准.
 
SPCOMM是消息任务的,所以没有超时进行控制.
 
1.如上所说SPCOMM是事件驱动,即有数据到达或缓冲中有数据要发送会自动触发读写事件,故不必设置读写超时
2.数据丢包多半是因为比特率太高所至,降低比特率就可以解决问题,如果还不能解决有可能是数据线的问题了。
 
串口通讯最把握的还是使用API来设计
不过虽然相关函数不多,但是想设计一个完整好用的代码也是不容易的
如果需要精确控制时间,最好使用CPU震荡次数和频率来计时
GetTickcount函数本身就有15毫秒的误差的
本人设计了一个串口通讯类
带有超时参数
带有延时功能,能将误差缩小到+5毫秒
 
楼上的东西是开源的吗?
 
还CPU震荡次数和频率,太有才了
一般使用Overlapped和WaitForSingleObject或者WaitForMultipleObjects完全可以了
 
不是开源的,不过等手头的项目完成了
可能会考滤把它包装成DLL,并发布一个测试版本,对提供有用建议的富翁赠送正式版本
to:yblee
在实际的实时数据采集系统中,有时候必须要严格控制时间
WaitForSingleObject本身也是有+-15毫秒误差的
 
俺就在读串口前加了个sleep(20)
 
串口通信的控件很多,我用的是tubor power的控件,很好。
 
个人觉得WINDOWS本身就不是一个针对实时的OS,因此用时隙协议的通讯方式本身就不适用,如果真的一定要这样用,还不如先用单片机做一个通讯接口件来缓冲和协议转换,这样更安全
 
本人觉得,如果没有超时保护的话,发送一个错误命令或在一定时间内未收到数据,岂不如石沉大海?
 
贴子我先结了,想要交流可以再继续...
 
多人接受答案了。
 
最后怎么解决的
 
后退
顶部