1

コンポーネントが正常に動作する AT コマンドを使用して制御する SMS ゲートウェイがありますが、デバイスから受信した文字列を正確に解析できません。

まず第一に、私はハードウェアのフロー制御を使用していますが、それがどのように影響するのでしょうか?

TComDataPacket コンポーネントを使用しています。イベント onPacket() があり、デバッガーを使用すると文字列を受信します。文字列は正常に表示されますが、pos() を使用して検索するか、ShowMessage() を使用して文字列を表示すると、文字列は非常に短くなります。 #00が見えない

RxChar イベントを使用してみましたが、トリガーされず、RxBuf でアクセス違反が発生します。

私は Delphi XE 2 を使用していますが、コンポーネントに問題があるのでしょうか、それとも私が何か間違ったことをしているのですか?

LE : メソッドの最後にスリープを挿入しないと、イベント onPacket() がフリーズします。コードは次のとおりです。

procedure TfrmMain.comPacketPacket(Sender: TObject; const Str: string);
var
  S,numar,coord : string;
  i,poi,rr,j,tmp2 : Integer;
const
  Readul = 'READ|';
  delim  = 'gps=';
  CMG = 'CMGL';
begin
  if pos('CMTI',Str) > 0 then
                          SendATCommand('AT+CMGL="ALL"');
  for i := 1 to Length(Str) do
    if Str[i] in ['A'..'Z','a'..'z','0'..'9','=','.'] then S := S + Str[i]
    else if Str[i] = '"' then S := S + '|';
    repeat
       poi := Pos('gps=',S);
       if poi > 0 then
       begin
          j := poi;
          repeat
            Dec(j);
            rr := PosEx(Readul,S,j);
            if rr >= poi then  rr := 0;
          until (rr>0) or (j = 1);
          numar := Copy(S,rr+Length(Readul)+1,PosEx('|',S,(rr+Length(Readul)+1)) - (rr + Length(Readul) + 1));
          ShowMessage('Trimit la numarul ' + numar);
          coord := Copy(S,poi + Length(delim),PosEx(CMG,S,poi) - poi - Length(CMG));
          S := Copy(S,poi + Length(delim),Length(S));
       end;
    until poi = 0;
    Sleep(1500);
end;
4

1 に答える 1

1

ここでの問題は文字列です。XE2 では、string は Unicode 文字列です。Delphi 2007 以前では、string は ansi string です。それらのサイズは異なります。TComport のソースをチェックして確認する必要があります。

于 2012-05-12T00:35:50.763 に答える