大家好,我是Delphi的新手,求救Delphi关于串口通信的问题,在Delphi中我用了第三方控件SPCOMM,也下了串口调试助手(精装版 v3.5) 但是在Delphi运行之后点击memo1,出现数据发送失败,在调试助手中有已发送的字节数,但却接收不到任何的字节数,请高手们帮我指点下,急!
另外能不能指导我下串口调试助手具体要怎么用,我不知道是不是我的操作问题
下面是我做串口时用的源代码(对串口这块一窍不通,所以先从网上的教程上下了一段,想先对串口进行熟悉)
unit Comm;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, SPComm, Buttons;type
    TFCOMM = class(TForm)
    Comm6: TComm;
    Btn_send: TBitBtn;
    BitBtn2: TBitBtn;
    memo1: TMemo;
    Comm4: TComm;
    procedure BitBtn2Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure senddata;
    procedure Btn_sendClick(Sender: TObject);
    procedure Comm6ReceiveData(Sender: TObject; Buffer: Pointer;BufferLength: Word);  private
    { Private declarations }
  public
    { Public declarations }
  end;//变量说明  
var
fcomm: TFCOMM;
var
viewstring:string;
i:integer;
rbuf,sbuf:array[1..16] of byte;implementation{$R *.dfm}//变量说明
//var
//fcomm: TFCOMM;
//viewstring:string;
//i:integer;
//rbuf,sbuf:array[16] of byte;
 
//打开串口
procedure TFCOMM.FormShow(Sender: TObject);
begin  
comm6.StartComm;
end;  
 
//关闭串口   
procedure TFCOMM.FormClose(Sender: TObject; var Action: TCloseAction);
begin
comm4.StopComm;
end;  //自定义发送数据过程  
procedure TFCOMM.senddata;
var
i:integer;
commflg:boolean;
begin
   viewstring:='' ;
   commflg:=true;
   for i:=1 to 6 do
     begin
        if not fcomm.comm4.writecommdata(@sbuf[i],1) then
           begin
               commflg:=false;
               break;
           end;
//发送时字节间的延时
        sleep(2);
        viewstring:=viewstring + inttohex(sbuf[i],2)+'' ;
     end;
     viewstring:='发送'+ viewstring;
     fcomm.memo1.lines.add(viewstring);
     fcomm.memo1.lines.add('');
     if not commflg then messagedlg('发送失败!' ,mterror,[mbyes],0);
end;
//发送按钮的点击事件
procedure TFCOMM.Btn_sendClick(Sender: TObject);
begin   
sbuf[1]:=byte($f0); //帧头
sbuf[2]:=byte($01); //命令号
sbuf[3]:=byte($ff);
sbuf[4]:=byte($ff);
sbuf[5]:=byte($01);
sbuf[6]:=byte($f0); //帧尾
senddata;//调用发送函数
end;  //接收过程
procedure TFCOMM.Comm6ReceiveData(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 TFCOMM.BitBtn2Click(Sender: TObject);
begin
    close;
end;end.该段源码我编译没有错,但是在运行的时候却一直出现数据发送失败,请大家指教,谢谢!!

解决方案 »

  1.   

    没有设置就直接startcomm了。 comm6.CommName:='com6';
     comm6.BaudRate:=9600;
     comm6.ByteSize:=_8;
     comm6.ParityCheck:=false;
     comm6.Parity:=none;
     Comm6.StopBits := _1;
     comm6.StartComm;这样就可以了
      

  2.   

    这些我在PSCOMM的属性中都已经设置过了,再帮忙看下啦
      

  3.   

    发送是comm4, 接收却是comm6? comm4都没有StartComm, 怎么能够发送成功?
      

  4.   

    unit Comm;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, SPComm, Buttons;type
        TFCOMM = class(TForm)
        Comm6: TComm;
        Btn_send: TBitBtn;
        BitBtn2: TBitBtn;
        memo1: TMemo;
        Comm4: TComm;
        procedure BitBtn2Click(Sender: TObject);
        procedure FormShow(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure senddata;
        procedure Btn_sendClick(Sender: TObject);
        procedure Comm6ReceiveData(Sender: TObject; Buffer: Pointer;BufferLength: Word);  private
        { Private declarations }
      public
        { Public declarations }
      end;//变量说明  
    var
    fcomm: TFCOMM;
    var
    viewstring:string;
    i:integer;
    rbuf,sbuf:array[1..16] of byte;implementation{$R *.dfm}//变量说明
    //var
    //fcomm: TFCOMM;
    //viewstring:string;
    //i:integer;
    //rbuf,sbuf:array[16] of byte;
     
    //打开串口
    procedure TFCOMM.FormShow(Sender: TObject);
    begin  
    comm6.StartComm;
    comm4.StartComm;
    end;  
     
    //关闭串口   
    procedure TFCOMM.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
    comm4.StopComm;
    comm6.StopComm;
    end;  //自定义发送数据过程  
    procedure TFCOMM.senddata;
    var
    //i:integer;
    commflg:boolean;
    begin
       viewstring:='' ;
       commflg:=true;
       for i:=1 to 6 do
         begin
            if not fcomm.comm4.writecommdata(@sbuf[i],1) then
               begin
                   commflg:=false;
                   break;
               end;
    //发送时字节间的延时
            sleep(2);
            viewstring:=viewstring + inttohex(sbuf[i],2)+'' ;
         end;
         viewstring:='发送'+ viewstring;
         fcomm.memo1.lines.add(viewstring);
         fcomm.memo1.lines.add('');
         if not commflg then messagedlg('发送失败!' ,mterror,[mbyes],0);
    end;
    //发送按钮的点击事件
    procedure TFCOMM.Btn_sendClick(Sender: TObject);
    begin   
    sbuf[1]:=byte($f0); //帧头
    sbuf[2]:=byte($01); //命令号
    sbuf[3]:=byte($ff);
    sbuf[4]:=byte($ff);
    sbuf[5]:=byte($01);
    sbuf[6]:=byte($f0); //帧尾
    senddata;//调用发送函数
    end;  //接收过程
    procedure TFCOMM.Comm6ReceiveData(Sender: TObject; Buffer: Pointer;BufferLength: Word);
    //var  
    //i:integer;
    begin
    viewstring:='' ;
    move ( buffer^, pchar(@rbuf)^,bufferlength);
    //move(buffer ,rbuf,bufferlength);
    //move(buffer ,rbuf[1],bufferlength);
    for i:=1 to bufferlength do
    viewstring:=viewstring+ inttohex(rbuf[i],2)+'' ;
    viewstring:='接收'+ viewstring;
    memo1.lines.add(viewstring);   
    memo1.lines.add('' );
    end;
    procedure TFCOMM.BitBtn2Click(Sender: TObject);
    begin
        close;
    end;end.我用的是USB转串口的线,一共两个串口,分别是com4和com6,我本来的打算是一个串口作为接收,另一个作为发送……
    我在串口这一块是完全的新手,希望大家多多帮忙!
    想问下,接收和发送数据只要一个串口就可以解决了么??
    还有串口调试助手具体是怎么结合Delphi用的啊,应该先运行Delphi还是串口助手啊?急
      

  5.   

    求助求助!
    我现在改为用同一个串口进行发送和接收了,现在已经可以正常发送,但是无法正常接收,我在procedure TFCOMM.Btn_sendClick(Sender: TObject); 想调用接收函数procedure TFCOMM.Comm6ReceiveData(Sender: TObject; Buffer: Pointer;BufferLength: Word); 但是无法通过编译,请各位指教这是什么原因,错误为:[Error] Comm.pas(101): Not enough actual parameters
    怎么样才能正常接收数据??
      

  6.   

    接受的过程加一个application.ProcessMessages;
    procedure TFCOMM.Comm6ReceiveData(Sender: TObject; Buffer: Pointer;BufferLength: Word); 
    //var  
    //i:integer; 
    begin 
    viewstring:='' ; 
    move ( buffer^, pchar(@rbuf)^,bufferlength); 
    //move(buffer ,rbuf,bufferlength); 
    //move(buffer ,rbuf[1],bufferlength); 
    for i:=1 to bufferlength do 
    viewstring:=viewstring+ inttohex(rbuf[i],2)+'' ; 
    viewstring:='接收'+ viewstring; 
    memo1.lines.add(viewstring);  
    memo1.lines.add('' ); 
    application.ProcessMessages;
    end; 
      

  7.   

    ……还是不行啊
    我需要编一个测试系统,需要通过两个串口分别与PLC和PC进行通信,传输数据的,所以我打算先用网上的关于串口通行的程序进行尝试
    想请教下,我需要在我的测试系统中写关于底层串口的通信,如:readtesterport,writetesterport,readplcort,writeport要具体怎么写啊,我用的是SPCOMM控件。我是2个月前刚入手Delphi的,还不大懂,特别是串口这一块,请各位多多帮忙啊,急!! 
    还有麻烦告诉我我现在的这段程序和我要做的到底相不相关啊,到时有没有用,谢谢啊
      

  8.   

    我说一句,接受端和发送端不能再一台机器上运行。串口要求一一对应。因为无法再机器上虚拟出两个相同的com口,所以接受端和发送端不能再一台机器上运行。
      

  9.   

    楼主先打开两个调试助手分别连两个串口,然后试下是否能通,如果能通且数据正确再看代码。
    另外两个串口互相通讯要注意接线问题,要用交叉线。另外接受端和发送端当然可以在一台机器,只要有硬件接口
    我机器上还4个串口呢用了PCI转串口卡=。=
    我测试时用的4头线,一个串口发,一个串口接设备,一个串口监听发出的,一个串口监听设备回送的
      

  10.   

    把串口线2 /3 脚短接, 设置两个MEMO,看能不能正常收发。
      

  11.   

    move ( buffer^, pchar(@rbuf)^,bufferlength); 
    把^提到括号里面来就行了  pchar(@rbuf^),
      

  12.   

    15楼:把串口线2 /3 脚短接, 设置两个MEMO,看能不能正常收发。怎么短接啊