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

Delphi 11 控件安装(SPComm) 网络上Delphi控件(Component)安装多以十几年前的Delphi6或Delphi7为主,Delphi新版本的例子很少。下面以著名的Spcomm串口控件为例,说明在Delphi最新版本Delphi 11上如何安装控件 阅读详情

最近做的工具需要实现串口转UDP中间件,中间件与下位机通过RS232通讯,与接收服务器通过UDP通讯。

在传输过程中出现问题如下:

1. 通过PC机安装的虚拟串口进行调试,接收程序完全正常。

2.与下位机进行通讯测试,常规短报文接收都完全正常,但是在传输图片分包文件(包总长度:545)时出现报文内部分字节丢失的问题。

经过不断测试,发现:

1. 下位机发送的报文长度为545,无异常;

2. 串口转UDP转发过程完全正常;

3.中间件的串口接收出现问题,原本545的报文接收到后会变成540、542、543等,总会丢失几个字节;

折腾了一天终于找到原因,是由于在Delphi下使用的SPCOMM组件默认开启了Inx_XonXofFflow、TxContinueOnXOff、Outx_XonXoffFlow三个属性。

将这三个属性值设置为FALSE后测试,报文接收正常,转发也正常,问题解决。

 

经过查找相关资料,对该三个属性的解释如下(以下内容转载自http://blog.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就此关闭,如果再发送消息,就会造成Serial Port失去响应,只能通过重新启动计算机才能恢复。

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

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

FOutx_XonXoffFlow := True;

FInx_XonXoffFlow := True;
FXoffChar := chr($13);
Comm.Outx_XonXoffFlow:=False;

 

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

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

FXonChar := chr($11);

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

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

Comm.Inx_XonXoffFlow:=False;

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

以下内容转载自:

http://hi.baidu.com/firebirdrui/item/fbfe420bd16843e0f55ba66f

COM串口传输文件

spcomm 控件

1. ReadIntervalTimeout属性决定什么时候触发Comm1ReceiveData事件,也就是接收数据事件,例如设为100ms,那么在100毫秒内接收端会这段时间的数据当成一个包的数据,并触发接收事件。超过这100ms的数据成为另一包的数据。

2. 传输文件是有一个奇怪的显现,如果是txt文件的话,那么接收到的字节数是正确的,如果是doc,exe等文件,接收到的字节数是错误。当把接收端outtx_xonxoffflow属性值改成false以后,此问题得到解决,经试验inx_xonxoffflow属性对次没影响,而且发送端的这两个属性跟此情况也无关系

3. Spcomm应用的核心在于主线程、读线程和写线程之间的消息传递机制,而通信数据相关信息的传递也是以消息传递的方式进行的。在使用Spcomm进行串口通信编程,除按照说明使用外,还需要特别注意以下两个问题。

首先,Spcomm是通过ReadIntervalTimeout属性的设置,来确定所接收到的数据是否属子同一帧数据,其默认值是100ms,也就是说,只要任何两个字节到达的时间间隔小于1OOms,都被认为是属于同一帧数据,在与单片机协同工作时,要特别注意这个问题[2]。

另外,Spcomm的默认属性设置是支持软件流控制的,用于流控制的字符是13H(XoffChar)和11H(XonChar),当单片机以二进制方式发送数据时,必须要禁用Spcomm对于软件流控制的支持,否则,在数据帧中出现的13H,11H会被Spcomm作为控制字符而加以忽略。

Delphi:TComPort封装在DLL中,通讯时无法接收串口数据的解决办法 现象:将Tcomport(版本:ComPort Library ver. 3.0   )封装在DLL中,进行串口通讯时,无法接收数据! 解决办法:在创建组件时,只需要更改一个属性的设置就可以了。如下所示:          //DLL入口                      talencaport:=ttalencaport.Create(nil);      阅读详情

相关推荐

Delphi串口通信的实现

Delphi串口通信的实现 Delphi是一种具有功能强大、简便易用和代码执行速度快等优点的可视化快速应用开发工具,它在构架企业信息系统方面发挥着越来越重要的作用,许多程序员愿意选择 Delphi作为开发工具编制各种应用程序。但是,美中足之处是 Delphi没有自带的串口通信控件,在它的帮助文档里也没有提及串口通信,这就给编制通信程序的开发人员带来许多便。 目

zou5655的专栏 1677

SPCOMMDelphi中实现串口通讯

Delphi 实现串口通讯,常用的几种方法为:使用控件如MSCOMM和SPCOMM,使用API函数或者在Delphi 中调用其它串口通讯程序。利用API编写串口通信程序较为复杂,需要掌握大量通信知识,其优点是可实现的功能更强大,应用面更广泛,更适合于编写较为复杂的低层次通信程序。相比较而言,利用SPComm控件则相对较简单,该控件具有丰富的与串口通信密切相关的属性及事件,提供了对串口的各种操

Tercel99的专栏 3971

SPComm通信故障总是丢失0X11的原因分析

2. 传输文件是有一个奇怪的显现,如果是txt文件的话,那么接收到的字节数是正确的,如果是doc,exe等文件,接收到的字节数是误。首先,Spcomm是通过ReadIntervalTimeout属性的设置,来确定所接收到的数据是否属子同一帧数据,其默认值是100ms,也就是说,只要任何两个字节到达的时间间隔小于1OOms,都被认为是属于同一帧数据,在与单片机协同工作时,要特别注意这个问题。在使用Spcomm进行串口通信编程,除按照说明使用外,还需要特别注意以下两个问题

zxm8513CSDN博客 484

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

Delphi环境下基于SPCOMM控件开发 串口通讯报文字节丢失问题解决 最近做的工具需要实现串口转UDP中间件,中间件与下位机通过RS232通讯,与接收服 务器通过UDP通讯。 在传输过程中出现问题如下: 1.通过PC机安装的虚拟串口进行调试,接收程序完全正常。 2.与下位机进行通讯测试,常规短报文接收都完全正常,但是在传输图片分文件(总长 度:545)时出现报文内部分字节丢失问题。 经过断测试,发现: 1.下位机发送的报文长度为545, 无异常; 2.串口转UDP转发过程完全正常; 3.中间

GuoGuoABC 732

spcomm数据丢失解决方法

上位机为delphi编写,控件使用spcomm通过单片机向上位机串口发送数据,数据总长度为53,总是在第18位丢失一个字节 17(0x11),查看spcomm属性xOnChar的值为#17,怀疑和此值有关,但又知道修改为和值。于是找goole大神,说将Outx_XonXoffFlow的属性设为false即可,果然如此。顺便将搜到的一些宝贵资料贴出,以便查阅目前我已经在1.2的版本中修复了一些

liuin的专栏 3723

SPComm的一点小诀窍 spcomm问题导致数据丢失 0x11与0x13

最近几天完成了BiasDAC的程序编写。调试的过程还算比较顺利,除了几个有点bt的小问题。其中一个困扰了我两三天的时间,今天上午终于将其解决。 由于BiasDAC是用RS232 Serial Port通信的,延用之前的程序,使用了DelphiSPComm控件。在之前的使用中,SPComm控件一直工作正常,使用的是一般的string进行消息的传递。 而BiasDAC由于通信协议的限制,消息

Tercel99的专栏 1858

delphi---spcomm

,

前进的博客 2709

Delphi 串口通信(Spcomm组件)的应用

/设置对应上图位置。//注意类型要进行转换。cmconnect.CommName := 串口名称;//如COM1,COM2等。像这种类似USB的串口,它可以在注册表种找到;那么问题来了,串口的名字如何自动获取呢。要引用单元文件SPComm

weixin_55262935的博客 1156

SPCOMM的主要属性,方法和事件

SPCOMM的主要属性,方法和事件1.属性CommName:填写COM1,COM2…等串口的名字,在打开串口前,必须填写好此值。 BaudRate:设定波特率9600,4800等,根据实际需要来定,在串口打开后也可更改波特率,实际波特率随之更改。ParityCheck:奇偶校验。ByteSize:字节长度_5,_6,_7,_8等,根据实际情况设定。Parity:奇偶校验位StopBits:

qq7187057的专栏 1835

SPCOMM串口通信控件深入解析

高级配置项是SPCOMM控件中一些那么常用的参数,但它们可以提供更细粒度的控制,以适应特殊的通信需求。这些配置项括:RThreshold: 设置接收缓冲区达到多少字符时触发事件。SThreshold: 设置发送缓冲区少于多少字符时触发comEvSend事件。Handshake: 设置硬件握手协议。RTSOn: 设置 RTS(Request To Send)信号状态。设备控制应用通常涉及到工业自动化领域,例如生产线上的机器人、装机械或其它自动化设备。

weixin_42596214的博客 1055

spcomm

SPCOMM的属性、方法和事件1.属性●CommName:表示 COM1、 COM2等串口的名字;●BaudRate:根据实际需要设定的波特率,在串口打开后也可更改此值,实际波特率随之更改;●ParityCheck:表示是否需要奇偶校验;●ByteSize:根据实际情况设定的字节长度;●Parity:奇偶校验位;●StopBits:停止位;●SendDataEmpty:这是一个布尔型属性,为 tr

670

delphi中使用spcomm来实现串口通讯

(2012-02-22 22:14:41)转载▼标签: 杂谈分类: Delphi转自——飘雪的世界最近两天一直在研究spcomm控件的使用,之前也是很太明白,看了很多的例子,可是按照网上很多的例子它们多少都有点瑕疵,运行了,鉴于自己在做这方面的项目,也用了645规约试验了下,现在终于明白了一点。过要想精通还再要学习!先把我的学习经验跟大家分享下,也让很多新手快点上手。其实相对于mscomm来...

itkeyuan的专栏 8361

SPComm接收数据的两种方法

在使用SPComm接收数据时,要用到指针,函数原型为:procedure TForm1.commReceiveData(Sender: TObject; Buffer: Pointer;  BufferLength: Word);beginend;其收到数据时,它提供了一个指针Buffer,指向这个存放数据的缓冲区的首地址,长度为BufferLength,这样就知道收到的是什么东东了,可以有两种方法取出其中内容:var  pc:PChar;begin  pc:=PChar(Buffer);  Memo1.L

6858

串行通信控件SPCOMM详细解析与实践

SPCOMM控件是一个在Windows平台上广泛使用的串行通信控件,它为开发者提供了一种简单而高效的方式来实现串口通信。控件支持主流的编程语言如VB、VC、Delphi等,并且具备强大的误处理能力和丰富的配置选项。事件驱动编程是一种编程范式,它在程序的控制流由外部事件来决定。这些事件可能来自于用户交互,如鼠标点击或按键,也可能来自系统消息,如定时器事件。在事件驱动模型中,应用程序停地查询设备状态或者等待输入,而是“等待”事件的发生。当事件发生时,系统会调用事件处理程序来响应该事件。

weixin_36212459的博客 915

SPCOMM控件串口通信高效实现指南

串口通信是一种通过串行通信接口(通常称为RS-232接口)进行数据传输的通信方式。它简单且可靠,广泛应用于计算机与各种外围设备之间,如调制解调器、工业控制器以及许多串行接口设备。在信息技术的快速发展下,串口通信依旧扮演着重要角色,尤其在嵌入式系统和物联网设备中,它是连接外部世界的桥梁。SPCOMM控件作为Windows平台下一款广泛使用的串口通信控件,其发展历程伴随着计算机通信技术的革新。自从早期版本1.0发布以来,SPCOMM经历了多次重大更新,每个新版本都旨在提高稳定性和扩展新功能。

weixin_27645199的博客 726
上一篇: DALFactory有什么作用
下一篇: 等待函数(保持界面正常响应)
Rshh
博客等级 码龄17年 12粉丝 17原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值