----  
--  作者:qingyun
--  发布时间:2004-11-18 11:10:07

--  spcomm发送和接收二进制或ascii码设置


//=====  spcom发送二进制:
var
      sendbuf:array[0..9] of byte;
      
     begin
          for i := 0 to 9 do
            begin
              sendbuf[i]:=i;
              self.Comm1.WriteCommData(@sendbuf[i], 1);
            end;
     end;

//=====   spcom发送ascii码:
var
str:string;
begin
str:=\'abcd\';
Comm1.WriteCommData(PChar(str), length(str));
end;

//===== spcom接收二进制:

procedure TfrmZh.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
  BufferLength: Word);
var
  Buf: array of Byte;
begin
setlength(buf, BufferLength);
CopyMemory(@Buf[0], Buffer, BufferLength);
end;
//===== spcom接收ascii码:
procedure TfrmZh.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
  BufferLength: Word);
var
    p: PChar;
   str:string;
begin
      p := Buffer;
      str := p;
end;



[此贴子已经被作者于2004-11-18 11:11:06编辑过]

--  作者:wms
--  发布时间:2004-12-12 9:46:18

--  还有问题没有解决?!

      对于此法,单独串口都没有任何问题,但是使用多个spcomm控件,分别对应多个串口,同时进行数据收发,会出现发出数据后没有数据应答的情况,收不到!

     原因可能出在读取内存缓冲区:
  setlength(buf,BufferLength);
  CopyMemory(@Buf[0], Buffer, BufferLength);
    两句上,不同串口缓冲数据相互覆盖,读取不到,或者读取时数据正在刷新。

      我现再只好用一个spcomm,轮询通讯的方式,但是因为多个串口本身要求的数据位、停止位、校验位都不同,每次都要重新初始化串口设置参数,CPU效率非常差。

      没有别的方法了?
     网上说可以使用:

viewstring:=‘’ ;
move(buffer^,pchar(@rbuf^),bufferlength);
for i:=1 to bufferlength do
  viewstring:=viewstring+ inttohex(rbuf[i],2)+‘’ ;
viewstring:=‘接收’+ viewstring;

我试验过了,指针类型不对,无法使用上述方法。