2012-05-10 57 views
1

我有一个SMS网关,我使用AT命令控制组件工作正常,但我无法解析从设备corectly收到的字符串。TComPort代理奇怪

首先我使用硬件流量控制如何影响我?我使用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; 
+0

您使用的是哪个版本?有几个竞争版本。许多版本在数据包组件中都有严重的错误。我遗憾地并且虚心地承认我没有使用这个数据包,因此我一直对从不修复数据包bug感到厌恶。避免数据包。没有它。完成。 –

+0

@WarrenP此组件http://sourceforge.net/projects/comport/ – opc0de

+0

的最新版本,相信这个版本仍然对Unicode的德尔福包的bug。 –

回答

1

这里的问题是字符串。 在XE2中,字符串是unicode字符串。在Delphi 2007及以下版本中, ,string是ansi字符串。 它们的大小是不同的。 您必须通过检查TComport来确认。