CnPack Forum » CnVCL 组件包 » 有关TCnModem的两个疑惑


2010-8-12 17:29 szyourname
有关TCnModem的两个疑惑

有关TCnModem组件,我有两个疑惑,请大家帮忙指点一下:
当调用SendATOk()函数发送AT指令时,
1、从串口中接收到成功应答数据,如果"OK"不是在一次ReceiveData中到达,而是先来"O", 第二次ReceiveData才收到"K",那SendATOK岂不是要返回失败?
2、是否会存在由于接收的数据中本身包含包括"OK"(如短信内容中包括了OK字符),而响应SendATOK对应答数据是否成功的准确性判断呢?

谢谢!

附CnModem单元的相关代码:[code]// 等待一条AT命令执行结果

function TCnModem.WaitATResult(Delay: Cardinal): string;

var

  Tick: Cardinal;

begin

  FWaitATResult := True;

  try

    FATResult := '';

    Tick := GetTickCount;

    while (GetTickCount - Tick < Delay) and (FATResult = '') do

      Application.HandleMessage;

    Result := FATResult;

    FATResult := '';

  finally

    FWaitATResult := False;

  end;

end;



// 发送一条AT命令,返回是否成功

function TCnModem.SendATOk(AT: string; Delay: Cardinal): Boolean;

var

  i, j: Integer;

  s: string;

begin

  Result := False;

  for i := 0 to 2 do

  begin

    WriteATCommand(AT);

    for j := 0 to 2 do

    begin

      s := Trim(UpperCase(WaitATResult(Delay)));

      if Pos('OK', s) > 0 then

      begin

        Result := True;

        Exit;

      end

      else if Pos('ERROR', s) > 0 then

      begin

        InvalidCommand(AT);

        Exit;

      end;

    end;

  end;

end;



// 接收到数据

procedure TCnModem.ReceiveData(Buffer: PAnsiChar; BufferLength: WORD);

var

  s: AnsiString;

begin

  if FWaitATResult then       // 正在等待AT命令执行结果

  begin

    FATResult := {$IFDEF DELPHI12_UP}String{$ENDIF}(Buffer);

    Exit;

  end;

  s := Buffer;

  s := {$IFDEF DELPHI12_UP}AnsiString{$ENDIF}(Trim(UpperCase({$IFDEF DELPHI12_UP}String{$ENDIF}(s))));

  if (ModemState in [msOffline, msOnlineCommand, msConnecting]) and (s = 'RING') then

    Ring                      // 振铃信号

  else if (ModemState = msOnline) and (s = 'NO CARRIER') then

    DisConnect                // 载波丢失

  else

    inherited;

end;[/code]

[[i] 本帖最后由 szyourname 于 2010-8-12 17:32 编辑 [/i]]

2010-8-15 21:25 solokey
CnModem有个超时设置,把读间隔超时的时间设置的稍微长一点..比如30-50ms,估计就没这个问题了.试试吧.

页: [1]
查看完整版本: 有关TCnModem的两个疑惑


Powered by Discuz! Archiver 5.0.0  © 2001-2006 Comsenz Inc.