我用SPCOMM的控件,将其串口号和BAUDRATE改为我要的值,其它用默认设置.然后进行数据的发送和接收,
可是接收到的数据却只有我发送出去的字符,却没有结果.
如comm1.writecomdata('at',2);
本来应该接收到ATOK才对,可是却只能接收到AT,就没了,这是为什么呀?procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
  BufferLength: Word);
var
  s:string;
begin
setlength(s,bufferlength);
move(buffer^,pchar(s)^,bufferlength);
memo1.Lines.Add(s);end;

解决方案 »

  1.   

    你的程序没有问题,问题在于你还不很了解AT指令。几乎所有的AT指令都是以回车(#13#10)结束的,所以得这样写:
    procedure TfrmMain.WriteComm (s : string);
    var
      sLen : integer;
    begin
      s := 'AT' + #$d + #$a;
      sLen := Length (s);
      comm.WriteCommData(@s[1],sLen);
    end;
    如果要关闭串口回显的话可以输入'ATE0'
      

  2.   

    请问可以在DLL中这样用吗?
    当我调用DLL中的writecommdata时,就报读地址错误了,应该怎么办呢?
      

  3.   

    在DLL中不可以用string作为输入输出的参数。
      

  4.   

    我没有用string型,我用的是Pchar型,就是下面这样子的,但是一运行到WriteCommdata的地方就出错,我都不知道怎么办了?Function Readsoftwareversion:Boolean;stdcall;
    Var
      s:Pchar;
    begin
      s:='AT+GMR'+#13+#10;
      if Tempcomm.WriteCommData(s,length(s)+1) then
        begin
        Result:=True
        end else
          begin
           Result:=False;
           end;end;
      

  5.   

    不大明白,在运行Tempcomm.WriteCommData(s,length(s)+1)时tempcomm是否已经创建?
      

  6.   

    TempComm是我动态创建的一个TCOMM.下面是动态库的完整代码,很简单,编译没有问题,但我在工程中调用DLL时,当运行到Writecommdata就出错。library Project2;uses
      Spcomm,
      SysUtils,
      Classes;type
      //ss=array[0..200] of char;
      TTempProc =class
    public
      class procedure Receivedata(Sender: TObject; Buffer: Pointer; BufferLength: Word);
    end;//var
      //str1:^ss;
    var
      Tempcomm:Tcomm;
      ComportReturnstring:Pchar;{$R *.res}
    Class procedure TTempproc.Receivedata(Sender: TObject; Buffer: Pointer; BufferLength: Word);
    Begin
      ComportReturnstring:=buffer;
    end;Function Comportinit(Comportno:string;Baudrate:word):Boolean;stdcall;
    begin
    try
      Tempcomm:=Tcomm.Create(nil);
      Tempcomm.CommName :=Comportno;
      Tempcomm.BaudRate :=Baudrate;
      Tempcomm.StartComm ;  Tempcomm.OnReceiveData :=TTempproc.Receivedata ;
      Result:=True;
    except
      Result:=False;
    end;
    end;Function Readsoftwareversion:Boolean;stdcall;
    Var
      s:Pchar;
    begin
      //s:='AT+GMR'+#13+#10;
      if Tempcomm.WriteCommData('at+gmr',length(s)+1) then
        begin
        Result:=True
        end else
          begin
           Result:=False;
           end;end;Function Comportfree:Boolean;stdcall;
    begin
      Tempcomm.StopComm ;
      Result:= True;
    end;Function ReturnResult:Pchar;stdcall;
    begin
      Result:=Comportreturnstring;
    end;exports
      Readsoftwareversion,
      ReturnResult,
      Comportinit;begin
    end.
      

  7.   

    可是,如果我想在发送完一个AT命令以后,用一个循环去判断返回的字符串,然后取得我要的返回的内容,为什么不行呢?SPCOMM不是多线程的吗?如果是多线程的,那么就应该是一有数据就会触发呀,即使我在做循环,可是为什么不行呢?