要向一个模块发送查询命令,命令格式31H、13H、PORT、Sum,PORT表示第几个端口,从1H开始共16个,Sum=31H + 13H + PORT 
收到命令后模块回应31H、13H、PORT、 H、L、CCR,PORT是询问的端口号,传输内容=H×256+L,均为16进制数,
用mscomm的实现发送和接收,要怎么写?:

解决方案 »

  1.   

    MSCOMM1.Port:=1;
    MSCOMM1.PortOpen := True;
    MSCOMM1.Output := '你的指令';
    在MSCOMM1Comm事件里
    Showmessage(MSCOMM1.Input);不过不推介用MSCOMM.相当的不稳定.有时候能发.但收不到数据.
    用SPCOMM吧.或者直接用API -WriteFile和ReadFile
      

  2.   

    SPCOMM比较好,MSCOMM经常丢数据,用法都差不多,SPCOMM有源码的
      

  3.   

    SPCOMM比较好,MSCOMM经常丢数据,用法都差不多
      

  4.   

    用WriteFile和ReadFile最為靈活。
      

  5.   

    根据网上的例子写了个,但是 发送失败是怎么回事var
      Form1: TForm1;
      Viewstring:string;
      i:integer;
      rbuf,sbuf:array[1..4] of byte;implementation{$R *.dfm}
    //打开串口
    procedure TForm1.FormShow(Sender: TObject);
    begin
    comm1.StartComm;
    end;
    //关闭串口procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
    comm1.StopComm;
    end;
    //发送数据
    //自定义的发送过程
    procedure Tform1.senddata;
    var
    i:integer;
    commflg:boolean;
    begin
    viewstring:='';
    commflg:=true;
    for i:=1 to 4 do
    begin
    if not Form1.comm1.writecommdata(@sbuf[i],1) then
    begin
    commflg:=false;
    break;
    end;
    sleep(2); {发送时字节间的延时}
    viewstring:=viewstring+inttohex(sbuf[i],2)+'';
    end;
    viewstring:='发送'+viewstring;
    memo1.lines.add(viewstring);
    memo1.lines.add('');
    if not commflg then messagedlg('发送失败!',mterror,[mbyes],0);
    end;//接收过程procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;BufferLength: Word);
    var
    i:integer;
    begin
    viewstring:='';
    move(buffer^,pchar(rbuf)^,bufferlength);
    for i:=1 to bufferlength do
    viewstring:=viewstring+inttohex(rbuf[i],2)+'';
    viewstring:='接受'+viewstring;
    memo1.lines.add(viewstring);
    memo1.lines.add('');
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    sbuf[1]:=byte($31); 
    sbuf[2]:=byte($13); 
    sbuf[3]:=byte($01);
    sbuf[4]:=byte($45);
    senddata;{调用发送函数}
    end;end.