常见的串口控件(1)
串口控件主要有三种:
mscomm: 微软的东西,是VB中带的一个ActiveX控件,使用简单,性能一般,由于是ActivX控件,打包时需要注册好多信息,在Delphi中使用,建议使用VCL控件,编译程序时直接编入程序中,再不需任何其它处理。
spcomm: 比较好的vcl控件,算是比较专业的,解剖了一下,功能比较完善。
TurboPower: 公认的专业通讯vcl控件。可以到其站点下载,开放源码了。
我在制作串口通讯软件时三种都用过,最终全部使用TurboPower!所以也推荐大家使用它。
写了个例子,基本的串口通讯都可以实现,可提供参考:
TurboPower串口通讯实际应用:
在串口通讯时有字符和十六进制两种数据传输方式,不论使用哪种方式,只要能正确收到数据就是目的,至于收到数据后如何处理,就要根据具体的情况来定了。
1.接收数据的方法:
轮询和中断(利用windows消息激发事件)。
1)轮询:每间隔一定的时间查询一下串口接收缓存中有无数据,有就读出来。这种方法是很毫资源的,即没事找事。
2)中断:在控件中有OnTrigger事件,当串口收到数据后,即触发此事件,无数据时什么都不做,在这个事件中接收数据就比较科学了。
所以,提倡使用控件中的OnTrigger事件接收数据。
2.通讯协议的制定:
接收数据的一般处理方法,最基本的思路就是通过协议进行分析,所以协议的制定是至关重要的:
1)首先要确定指令的起始点,从大量的数据流中将指令分离出来,没有起始标志的话,结果就可想而知了,一串无效的费数据!
2)然后就是指令结束识别点,可以利用指令的长度(如果长度一定或有表示长度的数据)或结束标志来确定,当然还可以利用下一条指令的指令头。
3)既然头尾都明确了,指令的截取想来不是什么问题了吧!但还有一种情况就是数据错误是的容错,如何容错呢,最简单的办法:发现不符合格式的指令,就将其抛掉或特殊处理(如要求重发)一下!
4)有效数据中如果增加一些校验,通讯将会更加可靠!
例:#(指令头)**(指令功能)0123456789(有效数据)**(有效数据校验和)%(指令尾)
注:**代表变动值。
3.接收数据的分析技巧:
通讯协议制定好后,一切将以通讯协议为中心。一套协议中的所有指令可能长度都是统一的,也有可能是长短不同的,并且在OnTrigger事件中实际反应速度及快,可能一条指令数据还没有完全收齐就已经触发了此事件,即收到了半截指令,并且有可能继续收取的数据中除了下半截指令外,还有下一条指令的前半截,如何处理?
我在做这种处理时是利用全局变量,将串口收到的所有数据都收到该串中,然后按指令格式进行截取,发现不合法指令做一下特殊处理(如要求重发)或抛弃。
如收到的数据串为:
#**0000012000**%#**0000000343#**000000540560**%#**0002200000**%
分段截为:
#**0000012000**%
#**0000000343
#**000000540560**%
#**0002200000**%
四条指令,其中:#**0000000343不完整,检测到后进行抛弃处理。
调试技巧篇:
对于已了解协议的支持串口产品,要想进行编程控制,可以使用“串口通讯控制器”进行调试,以摸清具体实现数据,可按如下步骤进行:
1.确定硬件连接无误,这是首要条件,如果错误将没有成功的可能;
连线必须正确,必要时可以使用计算机自带的多个端口相互进行测试,已保证硬件的连接无误。串口通讯线有9针和25针,多用9针,其中最重要的是2(RXD)、3(TXD)、5(GND)线,对应关系如下:
9针 25针
2 -- 3
3 -- 2
5 -- 7
2.确定通讯参数正确,如:波特率、奇偶校验位、数据位、停止位等,以及收发的是十六进制还是字符串:
3.以上确保正确,则使用“串口通讯控制器”,按协议输入数据进行收发控制了。
注意:有的仪器需要进行初始化,即先发一段激活指令,然后才能进入工作状态,这种设置主要是为了实现利用硬件为软件加密,即类似加密狗,需要有激活方法才行,不过该类方法使用较少。
原创作者:JPYC,望业界专家多多指正!
具体使用:
参考:http://hi.baidu.com/syxc/blog/item/47479e22ac2982f6d7cae227.html
1 ApdComPort控件简介
TApdComPort 是TurboPower公司为Delphi程序开发者提供的世界一流通信程序开发工具,它的众多属性和功能,可以满足串口通信程序的开发要求。应用程序使 用ApdComPort控件控制串口。所有I/O串口访问均调用TApdComPort方法,通过编写响应串行事件的事件处理器提供具体的操作方式。 ApdComPort控件的常用属性如下。
ComNumber:设置或返回串口号,值为 1、2时分别设置coml、com2。ComNumber并不验证串口号的有效性。当打开串口时,Windows驱动程序将决定串口号是否有效,如果无效,则出错。
AutoOpen:决定端口是否按要求自动打开。如果为 Ture,而且存取了一个要求具有打开的串口方法或属性时,ApdComPort控件将自动打开串口;为False时,端口必须明确打开。
Tracing:决定当前跟踪状态。
DTR:决定当前“Data Terminal Ready”信号的状态。
Open 属性:决定是否打开端口,是否用当前端口的所有属性初始化该端口。控件发送或接收字符前,Open必须设定为True。如果AutoOpen为True, 直接调用I/O方法或者属性。当Open属性为True时,TApdComPort控件根据当前属性分配输入和输出缓冲区,打开物理端口,设置初始化线 路、流量控制、Tracing和logging方式,然后为低级端口注册一个trigger,首先查看所有trigger事件,再将控制传递给适当的 OnTriggerXxx事件处理器。当Open属性设为False时,TApdComPort控件将Tracing和Logging设置为False, 关闭端口,重新分配输入和输出缓冲区。
StopBits属性:决定端口的停止位个数。可接受值为1和2。改变StopBits属性时,且端口已打开,则线路参数立即更新。由于StopBits属性传递给通信驱动程序之后校验已
赋值,因此驱动程序可能拒绝这个值,并将导致一个异常。
DataBits属性:决定端口的数据位的个数。可接受的值是5,6,7,8。
Parity属性:奇偶位决定端口的奇偶校验模式。
Baud属性:决定端口使用的波特率。可接收的值是300,1200,2300,3800,9600,19200,38300,57600和115200。
OutPut属性:向输出缓冲区中写入数据,在设计时无效,运行时只读。