0520kuang 发表于 2010-6-14 22:29:07

SPComm的一点小诀窍 spcomm的问题导致数据丢失串口

SPComm的一点小诀窍 spcomm的问题导致数据丢失串口

最近几天完成了BiasDAC的程序编写。调试的过程还算比较顺利,除了几个有点bt的小问题。其中一个困扰了我两三天的时间,今天上午终于将其解决。

由于BiasDAC是用RS232 Serial Port通信的,延用之前的程序,使用了Delphi的SPComm控件。在之前的使用中,SPComm控件一直工作正常,使用的是一般的string进行消息的传递。

而BiasDAC由于通信协议的限制,消息的发送使用的是hex方式,会用到从0x00到0xFF所有的这些字符。在调试中发现,发送0x11和0x13之后,SPComm的工作就会不正常。

首先是0x11发送之后,返回的0x11消息会被忽略;其次0x13发送之后,只能返回很有限的消息,而且似乎Serial Port就此关闭,如果再发送消息,就会造成Serial Port失去响应,只能通过重新启动计算机才能恢复。

后来上网上查询,原来不能正常处理0x11和0x13的问题早就存在,原因是SPComm空间中两个属性的存在。

OutX_XonXOffFlow/InX_XonXoffFlow:这个属性是指进行发送/接收时的软件握手标志,两个握手信号之间的数据被认为是通讯数据,收到握手信号后,通讯就中止了。

FOutx_XonXoffFlow := True;
FInx_XonXoffFlow := True;

默认的初始化中,这两个属性是默认开启的。

XOffChar/XOnChar:这是指握手的字节,默认的初始中,有

FXonChar := chr($11);
FXoffChar := chr($13);

至此,真相大白。0x11,0x13被占用为通讯握手信号,自然不会得到正确的处理。

问题找到了,解决也很容易。只需要在Comm的初始化中,自己定义

Comm.Inx_XonXoffFlow:=False;
Comm.Outx_XonXoffFlow:=False;

关闭软件握手功能即可。在一般通讯中,硬件已经具备了握手功能,所以也不会影响到正常的Comm通讯。



本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jinshaopu/archive/2009/10/09/4646791.aspx

cjr82123 发表于 2010-6-14 23:22:47

OK,TKS@

eworker 发表于 2010-6-15 07:52:37

总结的不错

TANK99 发表于 2010-6-15 08:45:19

啸峰工作室版的串口调试工具也有此类的BUG。

gyd0317 发表于 2010-8-17 20:30:16

mark

823032003 发表于 2010-8-17 21:51:01

才知道啊

da_wei 发表于 2010-9-19 22:29:35

不错,记下

zxzxy1988 发表于 2011-4-8 21:03:41

顶一个,今天在搞SPCOMM,幸亏先看了神坛的帖子,少走了不少弯路...

wxp_pf 发表于 2011-4-8 23:14:29

我也在这个问题上困扰了我半天时间!!!
页: [1]
查看完整版本: SPComm的一点小诀窍 spcomm的问题导致数据丢失串口