分享

TApdComPort 使用说明

 网文学习集 2017-12-01
转自

邬国丰的博客


​该控件包的官方网址为www.
我选择TApdComPort的原因:
1、能定义开头字符串及结尾字符串
2、能定义开头字符串及字符串长度
3、能定义接收的时间
ComNumber:设置或返回串口号,值为 1、2时分别设置coml、com2。ComNumber并不验证串口号的有效性。当打开串口时,Windows驱动程序将决定串口号是否有效,如果无效,则出错。
AutoOpen:决定端口是否按要求自动打开。如果为 Ture,而且存取了一个要求具有打开的串口方法或属性时,ApdComPort控件将自动打开串口;为False时,端口必须明确打开。
Tracing属性决定了当前跟踪状态。
当Tracing属性设为tlOff(默认值),则不执行跟踪。
为使能跟踪功能,设置 Tracing属性为tlOn。这分配一个2*TraceSize字节大小的内部缓冲区,通知调度器(dispatcher)开始用缓冲区。为使跟踪无效而不用写缓冲区的内容到磁盘文件,设置Tracing属性为tlOff。这样就释放了内部的缓冲区。
为了写跟踪缓冲区的内容到磁盘,设置Tracing属性为tlDump(重写命名为TraceName的文件,或创建一个新文件)或tlAppend(附加到一个已有文件或创建一个新文件)。控件写内容到文件后,设置Tracing属性为tlOff。
为清除跟踪缓冲区内容并继续跟踪,设置Tracing属性为tlClear。控件清除跟踪缓冲区后,设置Tracing属性为tlOn。
为了临时暂停跟踪,设置Tracing属性为tlpause。如果要恢复跟踪,设置Tracing属性为tlOn.
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属性:向输出缓冲区中写入数据,在设计时无效,运行时只读。
接收字符串的最简单的方法是用TAdTerminal控件,然而他的方法不能通过程序来控制,如果有必要,你可以用TApdComPort的
OnTriggerAvail 事件来实现之,事件的参数带接收的字符串的长度,通过这个长度,来逐一把字符添加到缓冲区.
数据流中检测字符串
有好几种方法:
1、OnTriggerAvail 事件
2、DataTriggers
3、使用TApdDataPacket组件,这是最简单的方法,因为他的这些可以在设计时期就可以做。
他的OnStringPacket,传回的是字符串,他的OnPacket传回的是指向字符串的指针。
检测包
4种传输方式
1、特定的字符表示特定的含义,比方说RZ#13表示Zmoden协议
2、有开始和结束符的。
3、有开始符的
4、有结束符的
无论那种,请注意TApdDataPacket.Enable属性设为True,
以保证数据的及时更新?!(原有数据可能有错或是我们目前应更注重接下来的数据)


​选择和配置Modem
如果是标准的Modem用TApdTapiDevice就可以了,但是如果不是标准的就应该考虑TAdModem了,他更加
他能应对复杂的情况。
TAdModem提供几千种Modem的配置结构,他包括不同的命令合回应的信息。
TAdModem的属性、事件和方法与TApdTapiDevice相似
Dial和AutoAnswer方法是设置Modem的拨号或应答状态的。
CancelCall方法是取消当前操作的。
TAdModem的优于TApdTapiDevice的一个方面是:
TAdModem可以在建立连接之前(拨号之前)以及建立连接之后都可以访问串口,而TApdTapiDevice只有在建立连接之后才可以访问串口。
配置TAPIDevice
TTapiConfigRec 记录保存着TAPI的设置信息.
GetDevConfig方法 给你当前的配置结构.
SetDevConfig方法强制把新的配置信息应用到TAPI设备上。
ShowConfigDialogEdit方法显示Modem的对话框,并给你变换了的配置信息。
首先通过设置TApdTapiDevic来选择设备,调出Modem的属性对话框,传回修改后的配置信息到TAPI,最后保存修改后的配置信息,以便将来加载。
拨号:
如果不用TApdTapiDevice组件的话,你需要直接向端口发送命令,如果远端应答,并且Modem之间协商好连接的类型,Modem将返回CONNECT,你可以使用TApdDatePacket组件来检测连接信息。
TAdModem和TApdTapiDevice组件都有Dial方法来呼叫指定的号码,TAdModem的Dial方法所使用的号码在PhoneNumber的属性里设定,TApdTapiDevice的Dial方法参数里指定所要呼叫的号码。
TAdModem检测到连接成功,OnModemConnct事件将激发,TApdTapiDevice检测连接成功后OnTapiConnect和OnTapiPortOpen事件将激发。
中断连接
TApdComPort的Open属性设为False,TApdTapiDevice的CancelCall方法和TAdModem的CancelCall方法中止连接。同时OnTapiPortClose和OnTapiFail事件将激发.
传送文件:
第一选择好协议,Zmodem是最理想的。
第二选择好文件,注意FileMask。
如果文件不好用FileMask来描述话,使用OnProtocolNextFile来作此事,OnProtocolNextFile事件激发后马上开始传输即调用StartTransmit。
FName属性指定要传送的文件名及路径。需要结束传输时,把FName赋为空窜即可。
当OnProtocolNextFile使用时,FileMask属性将被忽略。
要开始传输文件,调用StartTransmit方法,但传输完成后,OnProtocolFinish事件将激发。要看传输状态,放一个 TApdProtocolStatus组件在面板上,当调用StartTransmit方法时将被显示。传输成功后返回值为零, OnProtocolFinish是在所有文件传输后激发。不能看单个文件的传输状态,如果要看得话,使用OnProtocolLog事件,他在开始传输和传完单个文件激发。
事件:
TTriggerEvent = procedure( CP : TObject; Msg, TriggerHandle, Data : Word) of object;
Msg取下列值:
Message                Description
APW_TRIGGERAVAIL Corresponds to OnTriggerAvail.
APW_TRIGGERDATA Corresponds to OnTriggerData.
APW_TRIGGERTIMER Corresponds to OnTriggerTimer.
APW_TRIGGERSTATUS Corresponds to OnTriggerStatus.
Trigger事件的典型用法:
DataTrig := ApdComPort.AddDataTrigger('login:', True);
TimerTrig := ApdComPort.AddTimerTrigger;
ApdComPort.SetTimerTrigger(TimerTrig, 182, True);
...
procedure TMyForm.ApdComPortTrigger(CP : TObject; Msg, TriggerHandle, Data : Word);
var
I : Word;
C : Char;
begin
case Msg of
    APW_TRIGGERDATA :
      {got 'login', send response}
      ApdComPort.PutString('myname');
    APW_TRIGGERAVAIL :
      {extract and display/process the data}
      for I := 1 to Data do begin
        C := ApdComPort.GetChar;
        ...process data
      end;
    APW_TRIGGERTIMER :
      {timed out waiting for login prompt, handle error}
      ...
end;
end;
TriggerData事件的典型用法:
const
S : string = '';
...
CRTrig := ApdComPort.AddDataTrigger(#13, False);
...
procedure TMyForm.ApdComPortTriggerData(
CP : TObject; TriggerHandle : Word);
begin
if TriggerHandle = CRTrig then begin
    ...do something with S
    ApdComPort.RemoveTrigger(TriggerHandle);
end;
end;
只要 Comport 有收到資料, OnTriggerAvail就會觸發
procedure TMyForm.ApdComPortTriggerAvail(
CP : TObject; Count : Word);
var
I : Word;
begin
for I := 1 to Count do
    S := S + ApdComPort.GetChar;
end;
设置时间触发器:
第一步:用AddTimerTrigger增加一个时间触发器
第二步:用SetTimerTrigger使第一步中增加的触发器生效。Handle是时间触发器的句柄;Ticks表示多长时间后触发,1个Ticks大约55毫秒;Activate表示该触发器是否有效
时间触发器触发一次后自动失效,要重新启用该触发器,必须再次调用SetTimerTrigger方法
设置数据触发器:
ApdComPort.AddDataTrigger('UserID:', False);
表示无论何时只要收到'UserID:',则触发OnTriggerData事件。因为IgnoreCase参数被设置为false,所以收到的字符串必须大小写匹配
销毁或关闭一个端口,将自动remove其所有的触发器
发送数据:
下面这个例子先检查输出缓冲区的大小,然后发送
例1:
S := 'Guinness Stout';
if ApdComPort.OutBuffFree >= Length(S) then ApdComPort.PutString(S);
例2:
if ApdComPort.OutBuffFree >= 1 then ApdComPort.PutChar(C);
设置Output属性与调用PutString、PutChar方法是等效的

 

1》AutoOpen属性
     决定了端口是否按要求自动打开;如果为True,并且存取了一个要求具有打开串口的方法或属性,TApdComPort控件将自动打开串口,如果是False,端口必须明确的地开(通过设置Open属性为True).
     2》TapiMode属性
     决定TApdTapiDevice控件是否控制TApdComPort控件;TApdTapiDevice不能单独工作,它必须联合 TApdComPort一起工作,当创建一个TApdTapiDevice时,它为TApdComPort查找窗体,如果它找到一个,它检查 TApdComPort控件的TApiMode属性以决定TapdTapiDevice是否能使用它。
     如果TApiMode是默认值tmAuto,TApdComPort控件对TAPI使用可用,TApdTapiDevice保存一个到TApdComPort的指针并设置如下属性值:
     ApdComPort.TApiMode:=tmOn;
     ApdComPort.AutoOpen:=False;
     ApdComPort.Open:=False;
     改变TApiMode是tmOn已表明关联的TApdTapiDevice正在控制TApdComPort.设置AutoOpen和Open为False,是因为当他被打开或者被关闭(TAPI正在使用)时,TApdComPort不能再控制。
     为了关闭TApiMode模式,或防止TAPI设备控制TApdComPort,设置TApiMode为tmOff。为以后TAPI模式在使能,设置 TApiMode为tmAuto或tmOn,还需设置AutoOpen和Open为False,因为仅当TApdTapiDevice或 TApdComPort被首先创建时,TApdTapiDevice才自动设置这些属性。
     tmNone值没被使用。
     3》Tracing属性
   
     aplxz 857 2003-12-8 22:21:21
     Tracing属性决定了当前跟踪状态。
     当Tracing属性设为tlOff(默认值),则不执行跟踪。
     为使能跟踪功能,设置Tracing属性为tlOn。这分配一个2*TraceSize字节大小的内部缓冲区,通知调度器(dispatcher)开始用缓冲区。为使跟踪无效而不用写缓冲区的内容到磁盘文件,设置Tracing属性为tlOff。这样就释放了内部的缓冲区。
     为了写跟踪缓冲区的内容到磁盘,设置Tracing属性为tlDump(重写命名为TraceName的文件,或创建一个新文件)或tlAppend(附加到一个已有文件或创建一个新文件)。控件写内容到文件后,设置Tracing属性为tlOff。
     为清除跟踪缓冲区内容并继续跟踪,设置Tracing属性为tlClear。控件清除跟踪缓冲区后,设置Tracing属性为tlOn。
     为了临时暂停跟踪,设置Tracing属性为tlpause。如果要恢复跟踪,设置Tracing属性为tlOn.
     下面例子首先开启Tracing,然后转储(Dump)跟踪缓冲区到APRO.TRC。
     ApdComPoert.Tracing:=tlOn;
     ......
     ApdComPort.TraceName:='APRO.TRC';
     ApdComPort.Tracing:=tlDump;
     ...
   
     aplxz 859 2003-12-8 22:41:18
     4》Logging属性
     Logging属性决定当前日志状态。
     当Logging属性设为tlOff(默认值),没有执行日志功能。
     为了使能日志,设置Logging属性为tlOn。这分配一个LogSize字节大小的内部缓冲区并通知调度器去开始用这个缓冲区。为了不将日志缓冲区的内容写到磁盘文件,设置Logging属性为tlOff。这样也释放了内部缓冲区。
     为了将日志缓冲区的内容写到磁盘,设置Logging属性为tlDump或tlAppend。控件写文件之后,设置Logging属性为tiOff。
     为了清除缓冲区的内容并继续使用日志,设置Logging属性为tlClear。控件清除缓冲区之后,设置Logging属性为tlOn。
     为临时暂停日志,设置Logging属性为tlPause。为了恢复日志功能,设置Logging属性为tlOn。例:
     ApdComPort.Logging:=tlOn;
     ...
     ApdComPort.LogName:='APRO.LOG';
     ApdComPort.Logging:=tlDump;
     **********
   
     aplxz 860 2003-12-8 22:48:23
     5》DTR属性
     DTR属性决定当前“Data Terminal Ready”信号(DTR)的状态。
     下面例子表明在打开端口之后,降低DTR信号,其后升高DTR信号。
     ApdComPort:=TApdComPort.Create(Self);
     ApdComPort.Open:=True;
     ApdComPort.DTR:=True;
     ApdComPort.DTR:=False;
     ...
     ApdComPort.DTR:=True;
     **********
     aplxz 861 2003-12-8 23:02:03
     6》ComNumber属性
     ComNumber决定了TApdComPort控件使用的串口号(Com1、Com2、...).
     ComNumber并不验证串口号的有效性。当打开端口时,Windows通讯驱动程序将决定串口是否有效,如果无效,则出错。
     当改变ComNumber的属性时,如果端口打开,关闭已有的端口,用新串口号重新打开。在这个操作中,维持Trigger(触发器).
     当使用TAPI和Winsock设备层(Device Layer)时,这个属性被忽略。
     下面例子在运行期间创建、配置、打开一个ComPort控件
     ApdComPort:=TApdComPort.Create(Self);
     ApdComPort.ComNumber:=1;
     ApdComPort.Baud:=9600;
     ApdComPOrt.Parity:=pNone;
     ApdComPort.DataBits:=8;
     ApdComPort.StopBits:=1;
     ApdComPort.Open:=True;
     **********
     aplxz 862 2003-12-8 23:19:57
     7》Open属性
     决定是否打开端口,是否用当前的所有属性初始化该端口。
     当Open属性设置为True时,TApdComPort控 件将用所有当前属性设置来分配输入和输出缓冲区,打开物理端口,初始化线路设置(Line Setting)和流量控制(Flow Control)设置,并使Tracing和Logging有效或无效。然后为低级端口注册一个Trigger,其首先查看所有Trigger事件,并将控制传递给适当的OnTriggerXxx事件处理器。
     当Open属性设为False时,TApdComPort将关闭Tracing和Logging(通过设置相关的属性为tlDump,如果已经缓冲了信息,它将创建一个输出文件),关闭端口,重新分配输入和输出缓冲区。
     当Open属性已经为True时,设置Open属性为True是无害的;反之亦然。
     **********
     aplxz 864 2003-12-8 23:31:33
     8》StopBits属性
     决定端口的停止位的个数,可接受的值为1和2。如果DataBits等于5,一个请求2个停止位被解释为一个请求1.5个停止位。
     当改变StopBits属性时,如果端口已打开,线路参数立即更新。在把StopBit属性传递给通信驱动程序之前,StopBits不校验所赋予的值,驱动程序可能拒绝这个值,并将导致一个异常。异常:EBadArgument、EBadHandle。
     **********
     aplxz 865 2003-12-8 23:35:52
     9》DataBits属性
     决定端口的数据位的个数。可接受值是:5、6、7、8。
     当改变DataBits属性时,如果端口已打开,线路参数立即更新。把DataBit属性传递给通信驱动程序之前,DataBits不校验所赋予的值,驱动程序可能拒绝这个值,并将导致一个异常。异常:ENotSupported.
     **********
     aplxz 866 2003-12-8 23:40:46
     10》Parity属性
     决定端口的奇偶校验模式。
     当Parity被改变时,如果端口已打开,线路参数立即更新。把Parity属性传递给通信驱动程序之前,Parity不校验所赋予的值,驱动程序可能拒绝这个值,并将导致一个异常。异常:EBadHandle、ENotSupported.
     **********
     aplxz 867 2003-12-8 23:53:47
     11》Baud属性
     Baud属性决定端口使用的波特率。
     通常可接受的波特率值包括:300、1200、2400、4800、9600、19200、38400、57600、115200。
     当波特率被改变时,如果端口已打开,线路参数立即更新。把Baud属性传递给通信驱动程序之前,Baud不校验所赋予的值,驱动程序可能拒绝这个值,并将导致一个异常。异常:ENotSupported.
     用对象观察器输入一个波特率或调用SelectBaudRate属性编辑器,其提供了一个标准的下拉框。
     aplxz 868 2003-12-9 0:14:00
     12》OnConnectionStatus事件
     当Modem状态改变时,OnConnectionStatus定义了调用的事件处理器。
     这个事件处理所有TApdSModem状态改变。下面Modem状态将触发OnConnectionStatus事件:
     smsReady 空闲并就绪
     smsInitialize 开始初始化进程
     smsInitializeTimeout 等待初始化响应超时
     smsAutoAnswerBackground autoanswer模式,没振铃接收
     smsAutoAnswerWait autoanswer模式,等待第N个铃声
     smsAnswerWait 回应呼叫,等待连接
     smsDialWait 拨号呼叫,等待连接
     smsDialCycle 重试拨号尝试的时间
     smsNoDialTone 当拨号尝试时,Modem报告没有拨号音码
     smsConnected 处理连接过程
     smsHangup 开始挂断过程
     smsCancel 开始取消过程
     在OnConnectionStatus事件处理器,用TApdSModemStatusInfo类的方法来获取Modem状态和那个情况的合适的状态信息。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多