这是一个向串口发送数据的部分代码,其中writecom函数为向串口发送数据,而我用的是CPort串口控件,这是他的发送代码WriteCom(@oConnect, SizeOf(TConnect_Hdr)),尝试comport1.write(@oConnect, SizeOf(TConnect_Hdr))形式编译时出错,怎么才能用CPort串口控件发送变量的地址指针呢???部分代码
type
  TCommon_Hdr = Packed Record
  OpCode : Byte;
  Len    : Word;
  end;  TTarget_Hdr = Packed Record
    Head    : TCommon_Hdr;
    Who    : array[0..15] of Byte;
  end;  TConnect_Hdr = Packed Record
    Head    : TCommon_Hdr;
    Version : Byte;
    Flags   : Byte;
    Mtu     : Word;
    Target  : TTarget_Hdr;
  end;
end;var oConnect : TConnect_Hdr;function Connect(TargetBuf:array of Byte):Boolean;
var
  i: Integer;
begin
  Result := false;  oConnect.Head.OpCode  := CMD_CONNECT or FINAL;    CMD_CONNECT等为十六进制常量,形如$7F
  oConnect.Head.Len     := Swap(SizeOf(TConnect_Hdr));
  oConnect.Version      := VER;
  oConnect.Flags        := CONN_FLAGS;
  oConnect.Mtu          := $FFFF;
  oConnect.Target.Head.OpCode  := HDR_TARGET;
  oConnect.Target.Head.Len     := Swap(SizeOf(TTarget_Hdr));
  Move(TargetBuf, oConnect.Target.Who, 16);  WriteCom(@oConnect, SizeOf(TConnect_Hdr));
其中writecom函数为向串口发送数据end

解决方案 »

  1.   

    WriteCom(oConnect, SizeOf(TConnect_Hdr));把@去掉试试
      

  2.   

    回复 wywry(Wyatt)
    如果把@去掉不就是变量内容了吗?发送变量内容和发送变量指针有区别吗?
      

  3.   

    回复 luxuewei5214(小卢)
    我要发送变量的地址指针,有其它方法吗?变量都是十六进制值!
      

  4.   

    用串口发送变量的地址指针?WriteCom(@oConnect, SizeOf(TConnect_Hdr));参数oConnect可以为结构类型么,应该不行吧
      

  5.   

    回复 luxuewei5214(小卢)
    他代码就是这么写的,这是往手机上发送数据,要进行OBEX初始化及连接的!这是WriteCom函数,一楼忘记贴了!真是服了,代码具体不让发,说有伤害言论?下面这个是WriteCom函数,麻烦请看一下
    http://www.hlbrc.cn/dep/music/upload-admin/writecom.txt
      

  6.   

    要不用spcomm吧,我没用过cport
      

  7.   

    回复 luxuewei5214(小卢) 
    程序的50%已编写完了,现在就差这个了,要换spcomm都得重做,实在是麻烦啊!
      

  8.   

    改为指针:
    Type
      PConnect_Hdr=^TConnect_Hdr;
      TConnect_Hdr = Packed Record
        Head    : TCommon_Hdr;
        Version : Byte;
        Flags   : Byte;
        Mtu     : Word;
        Target  : TTarget_Hdr;
      end;....var oConnect : PConnect_Hdr; ....  WriteCom(oConnect, SizeOf(oConnect));
      

  9.   

    请搂住将WriteCom的声明或调用参数类型贴出来。
      

  10.   

    这是pas文件//Business application is forbidden.
    //Punishment - unavoidable crack and propagation on everything inet.
    unit ComPort;interface
    uses Windows,SysUtils;type
      ECommsError = class( Exception );var
      iComNum      : integer = 2; //
      iOldComOpen  : integer = 0;
      iComBaud     : integer = 115200; //
      iOldComBaud  : integer = 0;
      hCom         : THandle=INVALID_HANDLE_VALUE;
      ComTimeouts  : TCommTimeouts;
      txLen, rxLen : Dword;
      FlgOvrlp     : boolean = True;
      COMwr : OVERLAPPED;
      COMrd : OVERLAPPED;
      COMst : COMSTAT;
      DCB          : TDCB;
    { DCB结构 :
    0      DWORD fBinary: 1;          // binary mode, no EOF check
    1      DWORD fParity: 1;          // enable parity checking
    2      DWORD fOutxCtsFlow:1;      // CTS output flow control
    3      DWORD fOutxDsrFlow:1;      // DSR output flow control
    4..5   DWORD fDtrControl:2;       // DTR flow control type
    6      DWORD fDsrSensitivity:1;   // DSR sensitivity
    7      DWORD fTXContinueOnXoff:1; // XOFF continues Tx
    8      DWORD fOutX: 1;        // XON/XOFF out flow control
    9      DWORD fInX: 1;         // XON/XOFF in flow control
    10     DWORD fErrorChar: 1;   // enable error replacement
    11     DWORD fNull: 1;        // enable null stripping
    12..13 DWORD fRtsControl:2;   // RTS flow control
    14     DWORD fAbortOnError:1; // abort reads/writes on error
    15..31 DWORD fDummy2:17;      // reserved}function OpenCom(Mode:boolean) : boolean;
    procedure CloseCom;
    function GetComDCB : boolean;
    function SetComDCB : boolean;
    function GetComTimeouts : boolean;
    function SetComTimeouts : boolean;
    function SetComRxTimeouts(NewIntervalTimeout,NewTimeoutMultiplier,NewTimeoutConstant:dword) : boolean;
    function ReadCom(Buf:Pointer; BufLen:Dword) : boolean;
    function WriteCom(Buf:Pointer; BufLen:Dword) : boolean;
    function EscapeComFunction(dwFunc:Dword) : boolean;
    function GetComModemStatus : DWORD;
    function GetComStat : boolean;
    function PurgeCom(mode:Dword): boolean; // 清空读写缓冲区中的数据
    function WriteComStr(S: String): boolean;
    function ChangeComSpeed(Baud:integer) : boolean;implementationfunction OpenCom(Mode:boolean) : boolean;
    var
      dw : dword;
    begin
      result:=FALSE;
      if hCom<>INVALID_HANDLE_VALUE then
        CloseCom;  if FlgOvrlp then  // 同步、异步通讯模式
        dw:=FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED
      else
        dw:= 0;  // 同步  hCom:=CreateFile(PChar('\\.\COM'+IntToStr(iComNum)),GENERIC_READ or GENERIC_WRITE,0,nil,OPEN_EXISTING,dw,0);
      if hCom = INVALID_HANDLE_VALUE then
        Exit //raise ECommsError.Create( '串口打开失败.' )
      else
      begin
        if GetFileType( hCom ) <> FILE_TYPE_CHAR then
        begin
          CloseHandle( hCom );
          raise ECommsError.Create( '文件句柄不是通信句柄. ' )
        end;    if not SetupComm( hCom, 8192, 8192 ) then  // Rd , Wr
        begin
          CloseHandle( hCom );
          raise ECommsError.Create( '串口缓冲设置失败.' )
        end;    if GetComDCB then
        begin
          if Mode then
            DCB.Flags := (DCB.Flags and $ffff8000) or $0001
          else
            DCB.Flags := (DCB.Flags and $ffff8000) or $0011;   //$1011;      DCB.ByteSize := 8;
          DCB.Parity := 0;
          DCB.StopBits := 0;
          DCB.BaudRate := iComBaud;
          if SetComDCB then
          begin
            ComTimeouts.ReadIntervalTimeout:=20; //0
            ComTimeouts.ReadTotalTimeoutMultiplier:=1; //0
            ComTimeouts.ReadTotalTimeoutConstant:=4000; //200
            ComTimeouts.WriteTotalTimeoutMultiplier:=1;//MAXDWORD;
            ComTimeouts.WriteTotalTimeoutConstant:=3000;//MAXDWORD;
            if SetComTimeouts then
            begin
              iOldComOpen:=iComNum;
              iOldComBaud:=iComBaud;
              if Mode then
              begin
                sleep(75);
                EscapeComFunction(SETRTS); // 发送RTS信号
                sleep(25);
                EscapeComFunction(SETDTR); // 发送DTR信号
              end
              else
              begin
                sleep(75);
                EscapeComFunction(SETRTS); // 发送RTS信号
              end;
              result := TRUE;
            end;
          end;
        end;
      end;
    end;procedure CloseCom;
    var
      x: THandle;
    begin
      if hCom<>INVALID_HANDLE_VALUE then
      begin
        x:=hCom;
        hCom:=INVALID_HANDLE_VALUE;
        CloseHandle(x);
      end;
      iOldComOpen:=0;
    end;function GetComDCB : boolean;
    begin
      result := FALSE;
      if hCom<>INVALID_HANDLE_VALUE then
        result := GetCommState(hCom,DCB);
    end;function SetComDCB : boolean;
    begin
      result:=FALSE;
      if hCom<>INVALID_HANDLE_VALUE then
        result := SetCommState(hCom,DCB);
    end;
      

  11.   

    function ChangeComSpeed(Baud:integer) : boolean;
    var
      save_baud : integer;
    begin
      result:=FALSE;
      save_baud:=dcb.BaudRate;
      if hCom<>INVALID_HANDLE_VALUE then
      begin
        if GetComDCB then
        begin
          if dcb.BaudRate<>Dword(Baud) then
          begin
            dcb.BaudRate:=Baud;
            result := SetCommState(hCom,DCB);
            EscapeComFunction(SETRTS);
            EscapeComFunction(SETDTR);
            if not result then
            begin
              dcb.BaudRate:=save_baud;
              SetCommState(hCom,DCB);
              EscapeComFunction(SETRTS);
              EscapeComFunction(SETDTR);
            end;
          end;
        end;
      end;
    end;function GetComTimeouts : boolean;
    begin
      result:=FALSE;
      if hCom<>INVALID_HANDLE_VALUE then
        result := GetCommTimeouts(hCom,ComTimeouts);
    end;function SetComTimeouts : boolean;
    begin
      result:=FALSE;
      if hCom<>INVALID_HANDLE_VALUE then
        if SetCommTimeouts(hCom,ComTimeouts) then result:=TRUE;
    end;function SetComRxTimeouts(NewIntervalTimeout,NewTimeoutMultiplier,NewTimeoutConstant:dword) : boolean;
    begin
      result:=FALSE;
      if (ComTimeouts.ReadIntervalTimeout<>NewIntervalTimeout)
          or (ComTimeouts.ReadTotalTimeoutMultiplier<>NewTimeoutMultiplier)
          or (ComTimeouts.ReadTotalTimeoutConstant<>NewTimeoutConstant)
      then
      begin
        ComTimeouts.ReadIntervalTimeout:=NewIntervalTimeout;
        ComTimeouts.ReadTotalTimeoutMultiplier:=NewTimeoutMultiplier;
        ComTimeouts.ReadTotalTimeoutConstant:=NewTimeoutConstant;
        if hCom<>INVALID_HANDLE_VALUE then
          if SetCommTimeouts(hCom,ComTimeouts) then
            result:=TRUE;
      end
      else
        result:=TRUE;
    end;function  GetComStat : boolean;
    var
      dErr : DWORD;
    begin
      result:=FALSE;
      dErr := 0;
      if hCom<>INVALID_HANDLE_VALUE then
      begin
        GetCommState( hCom, dcb );
        if ClearCommError(hCom,dErr,@COMst) then
        begin
          // size Rx buff := COMst.cbInQue;
          Result := True;
        end;
      end;
    end;function ReadCom(Buf:Pointer; BufLen :Dword) : boolean;
    var
     dErr: Dword;
    begin
     result := False;
     if (hCom<>INVALID_HANDLE_VALUE)and(Buf<>Nil)and(BufLen<>0) then begin
      rxlen:=0;
      if FlgOvrlp then begin
       COMrd.hEvent:=CreateEvent(Nil,TRUE,FALSE,Nil);
       if not ReadFile(hCom,Buf^,BufLen,rxLen,@COMrd) then begin
        if not GetOverlappedResult(hCom,COMrd,rxLen,True) then begin
        end;
       end;
    //   ResetEvent(COMrd.hEvent);
       CloseHandle(COMrd.hEvent);
      end
      else begin
       if not ReadFile(hCom,Buf^,BufLen,rxLen,Nil) then begin
    //     ClearCommError(hCom,dErr,Nil);
    //     exit;
       end;
      end;
      if rxLen = BufLen then result := True
      else ClearCommError(hCom,dErr,Nil);
     end;
    end;function WriteCom(Buf:Pointer; BufLen:Dword) : boolean;
    Var
     dErr: Dword;
    begin
     result:=FALSE;
     if (hCom<>INVALID_HANDLE_VALUE)and(Buf<>Nil)and(BufLen<>0) then begin
      txLen:=0;
      if FlgOvrlp then begin
       COMwr.hEvent:=CreateEvent(Nil,TRUE,FALSE,Nil);
       if not WriteFile(hCom,Buf^,BufLen,txLen,@COMwr) then begin
        if not GetOverlappedResult(hCom,COMwr,txLen,True) then begin
        end;
    //     ClearCommError(hCom,dErr,Nil);
       end;
    //   ResetEvent(COMwr.hEvent);
       CloseHandle(COMwr.hEvent);
      end
      else begin
       if not WriteFile(hCom,Buf^,BufLen,txLen,Nil) then begin
    //     ClearCommError(hCom,dErr,Nil);
    //     exit;
       end;
      end;
      if txLen = BufLen then result:=TRUE
      else ClearCommError(hCom,dErr,Nil);
      //PurgeComm(hCom, PURGE_TXABORT + PURGE_TXCLEAR);
     end;
    end;function WriteComStr(S: String): boolean;
    begin
      Result:=WriteCom(@S[1],Length(S));
    end;function PurgeCom(mode:Dword): boolean; //function
    begin
     result := PurgeComm(hCom,mode); // 清空读写缓冲区中的数据
    end;function EscapeComFunction(dwFunc:Dword):boolean;
    begin
      result:=FALSE;
      if hCom<>INVALID_HANDLE_VALUE then
        result := EscapeCommFunction(hCom,dwFunc);
    end;
    //////////////////////////////////////////////////////////
    //  FUNCTION: GetComModemStatus
    //
    //  PURPOSE: Read the state of modem input pin right now
    //
    //  PARAMETERS:
    //     none
    //
    //  RETURN VALUE:
    //
    //     A DWORD variable containing one or more of following codes:
    //
    //     Value       Meaning
    //     ----------  -----------------------------------------------------------
    //     MS_CTS_ON   The CTS (clear-to-send) signal is on.
    //     MS_DSR_ON   The DSR (data-set-ready) signal is on.
    //     MS_RING_ON  The ring indicator signal is on.
    //     MS_RLSD_ON  The RLSD (receive-line-signal-detect) signal is on.
    //
    //     If this comm have bad handle or not yet opened, the return value is 0
    //
    //  COMMENTS:
    //
    //    This member function calls GetCommModemStatus and return its value.
    //    Before calling this member function, you must have a successful
    //    'StartOpen' call.
    //
    //
    function GetComModemStatus : DWORD;
    var
       dwModemState : DWORD;
    begin
      if hCom<>INVALID_HANDLE_VALUE then
         if not GetCommModemStatus( hCom, dwModemState ) then
            Result := 0
         else
            Result := dwModemState
    end;end.
      

  12.   

    根据该组件对方法WriteCom的定义,你的调用方法.
    Comport1.WriteCom(@oConnect,Sizeof(oConnect);
    因该没问题,你仔细看看编译出错的提示内容,最好把出错提示给出来。
      

  13.   

    你好,非常感谢你回答我的问题,程序编译时提示"Variable required",光标定位到"Comport1.WriteCom(@oConnect,"后面,估计是"@oConnect"有错误,但不明白是哪错了!已经困扰了好几天了,真是郁闷啊!
      

  14.   

    清华出版的delphi串口通讯一书详细介绍了串口通讯,并且作了一个Tcomm串口组件,挺方便的,试一试
      

  15.   

    你打开菜单项Project->Options..选择Complier选项页,将Typed @ opertor关闭试试。
      

  16.   

    Typed @ opertor是不是输入的@运算符?我用的是中文版是不是cport控件不支持@指针?这是截图
    http://www.hlbrc.cn/dep/music/upload-admin/a.JPG
      

  17.   

    呵呵,今天终于可以打开你的图片了,你可以做如下尝试,定义一个指针变量比如:
    var
      Buffer:Pointer;
    ....
      Buffer:=@oConnect;
      Comport1.WriteCom(Buffer,Sizeof(oConnect));
      

  18.   

    猜想WriteCom里的第一个参数是PChar类型吧(没看源代码),
    看来对类型转换要下点功夫了。
      

  19.   

    回wizardqi(男巫)
    高手啊,这回可以正常编译了,不知道是否能达到预期的效果呢!先谢谢了!回leeky(雅痞·千年虫)
    不好意思,新手啊!看来真得多学学了!