SPComm的一点小诀窍 spcomm的问题导致数据丢失 0x11与0x13错误
2015-06-30 06:59
344 查看
最近几天完成了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通讯。
由于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通讯。
相关文章推荐
- 用SPCOMM 在 Delphi中实现串口通讯
- DDR SDRAM
- 动态绑定HTML
- swift optionals - 1
- 使用Socket发送GET/POST请求
- 【NIO】dawn中buffer的使用
- 为什么google bazel构建工具流行不起来
- 【最大流】【HDU3338】【Kakuro Extension】
- 【最大流】【HDU3338】【Kakuro Extension】
- 程序集加载与反射(二):实例篇
- Oracle query that count connections by minute with start and end times provided
- Section 7 - 8 polymorphsim
- HackerRank - "The Coin Change Problem"
- The Venetian Macau h
- 数列、集合、逻辑学起码常识暴露课本一系列重大错误 ——数列起码常识否定5千年“常识”:无最大自然数
- 让程序员不再苦逼的四大神器
- hdu 5270 ZYB loves Xor II
- LeetCode "Roman to Integer"
- ORACLE 如何查询被锁定表及如何解锁释放session
- LeetCode "Integer to Roman"