Delphi环境下基于SPCOMM串口开发通讯报文字节丢失的问题解决

在Delphi环境下基于SPCOMM控件开发
串口通讯报文字节丢失的问题解决
最近做的工具需要实现串口转UDP中间件,中间件与下位机通过RS232通讯,与接收服
务器通过UDP通讯。
在传输过程中出现问题如下:
1.通过PC机安装的虚拟串口进行调试,接收程序完全正常。
2.与下位机进行通讯测试,常规短报文接收都完全正常,但是在传输图片分包文件(包总长
度:545)时出现报文内部分字节丢失的问题。
经过不断测试,发现:
1.下位机发送的报文长度为545, 无异常;
2.串口转UDP转发过程完全正常;
3.中间件的串口接收出现问题,原本545的报文接收到后会变成540、542、 543等, 总会丢失
几个字节;
折腾了一天终于找到原因,是由于在Delphi 下使用的SPCOMM 组件默认开启了
Inx_ XonXofFflow、 TxCont inueOnXOff、0utx_ XonXoffFlow 三个属性。
将这三个属性值设置为FALSE后测试,报文接收正常,转发也正常,问题解决。
经过查找相关资料,对该三个属性的解释如下(以下内容转载自
http://b1og. csdn. net/jinshaopu/ article/ details/4646791):
SPComm的_:点小诀窍spcomm的问题导致数据丢失
最近几天完成了BiasDAC的程序编写。调试的过程还算比较顺利,除了几个有点bt的小间
题。其中一个困扰了我两三天的时间,今天上午终于将其解决。
由于BiasDAC是用RS232 Serial Port 通信的,延用之前的程序,使用了Delphi的SPComm
控件。在之前的使用中,SPComm控件一直工作正常,使用的是一般的string进行消息的传
递。
而BiasDAC由于通信协议的限制,消息的发送使用的是hex方式,会用到从0x00到0xFF所
有的这些字符。在调试中发现,发送0x11和0x13之 后,SPComm 的工作就会不正常。
首先是0x11发送之后,返回的0x11消息会被忽略;其次0x13发送之后,只能返回很有限的消
息,而且似乎Serial Port 就此关闭,如果再发送消息,就会造成
Seria夫E响应,.
只能通过重新启动计算机才能恢复。
后来上网上查询,原来不能正常处理0x11和0x13的问题早就存在,原因是SPComm空间中两
个属性的存在。
OutX_ XonXOffF1ow/InX_ XonXoffFlow: 这个属性是指进行发送/接收时的软件握手标志,两
个握手信号之间的数据被认为是通讯数据,收到握手信号后,通讯就中止了。
FOutx_ XonXoffF1ow := True;
FInx_ XonXoffF1ow := True;
FXoffChar := chr($13);
Comm. 0utx_ XonXoffFlow: =False;
默认的初始化中,这两个属性是默认开启的。
xOffChar/XOnChar:这是指握手的字节,默认的初始中,有
FXonChar := chr($11);
至此,真相大白。0x1l, 0x13被 占用为通讯握手信号,自然不会得到正确的处理。
问题找到了,解决也很容易。只需要在Comm的初始化中,自己定义
Comm. Inx_ XonXoffF1ow:=False;
关闭软件握手功能即可。在-般通讯中,硬件已经具备了握手功能,所以也不会影响到正常
的Comm通讯。
以下内容转载自:
http://hi. baidu. com/ firebirdrui/ item/ fbfe420bd1 6843e0f 55ba66f
COM串口传输文件
spcomm控件
1. ReadIntervalTimeout 属性决定什么时候触发CommlReceiveData 事件,也就是接收数
据事件,例如设为100ms,那么在100毫秒内接收端会这段时间的数据当成一个包的数据,并
触发接收事件。超过这100ms的数据成为另一包的 数据。
2. 传输文件是有一个奇怪的显现,如果是txt文件的话,那么接收到的字节数是正确的,
如果是doc,exe 等文件,接收到的字节数是错误。当把接收端outtx_ _xonxoffflow属性值
改成false以后,此问题得到解决,经试验inx_ xonxoffflow属性对次没影响,而且发送端
的这两个属性跟此情况也无关系
3.Spcomm应用的核心在于主线程、读线程和写线程之间的消息传递机制,而通信数据相关
信息的传递也是以消息传递的方式进行的。在使用Spcomm进行串口通信编程,除按照说明.
使用外,还需要特别注意以下两个问题。
首先,Spcomm 是通过ReadIntervalTimeout 属性的设置,来确定所接收到的数据是否
属子同- -帧数据,其默认值是100ms, 也就是说,只要任何两个字节到达的时间间隔小于
100ms,都被认为是属于同一帧数据, 在与单片机协同工作时,要特别注意这个问题[2]。
另外,Spcomm的默认属性设置是支持软件流控制的,用于流控制的字符是13H(XoffChar)
和11H(XonChar),当单片机以二进制方式发送数据时,必须要禁用Spcomm对于软件流控制
的支持,否则,在数据帧中出现的13H,11H 会被Spcomm作为控制字符而加以忽略。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蝈蝈(GuoGuo)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值