2011-01-29 6 views
0

나는 델파이 2010에서 Comport와 통신하는 DLL을 개발 중입니다.델파이 DLL을 컴파일

그러나 포트에서 값을 가져 오지 못하는 문제가 있습니다. RxChar을 사용하고 있는데 com objet가 RxChar 명령을 트리거하지 않는다고 생각합니다.

어떻게 RxChar를 작동시켜 작동시킬 수 있습니까 ?? 특히 2400의 전송 속도로, 현대적인 기계에 괜찮아,하지만 지금은 핸드 쉐이크 라인을 제어하는 ​​당신에게 달려

unit unitfxvogir; 

{$WARN SYMBOL_PLATFORM OFF} 

interface 

uses 
    ComObj, ActiveX, AxCtrls, Classes, 
    ridFXVogir_TLB, StdVcl, CPort, CPortCtl, ExtCtrls; 

type 
    Tfxvogir = class(TAutoObject, IConnectionPointContainer, Ifxvogir) 
    private 
    { Private declarations } 
    FConnectionPoints: TConnectionPoints; 
    FConnectionPoint: TConnectionPoint; 
    FEvents: IfxvogirEvents; 
    { note: FEvents maintains a *single* event sink. For access to more 
     than one event sink, use FConnectionPoint.SinkList, and iterate 
     through the list of sinks. } 
    ComPort1: TComPort; 
    public 
    procedure Initialize; override; 
    procedure AfterConstruction; override; 
    procedure BeforeDestruction; override; 
    procedure ComPort1RxChar(Sender: TObject; Count: Integer); safecall; 
    protected 
    function OpnaVog(const ComPort: WideString): WordBool; safecall; 
    function LokaVog: WordBool; safecall; 
    function Vigt: WideString; safecall; 
    { Protected declarations } 
    function SendaSkipun(const Inntak: WideString): WordBool; safecall; 
    property ConnectionPoints: TConnectionPoints read FConnectionPoints 
     implements IConnectionPointContainer; 
    procedure EventSinkChanged(const EventSink: IUnknown); override; 
    end; 

implementation 

uses ComServ, unitAdgerdir; 

procedure Tfxvogir.EventSinkChanged(const EventSink: IUnknown); 
begin 
    FEvents := EventSink as IfxvogirEvents; 
end; 

procedure Tfxvogir.Initialize; 
begin 
    inherited Initialize; 
    FConnectionPoints := TConnectionPoints.Create(Self); 
    if AutoFactory.EventTypeInfo <> nil then 
    FConnectionPoint := FConnectionPoints.CreateConnectionPoint(
     AutoFactory.EventIID, ckSingle, EventConnect) 
    else FConnectionPoint := nil; 
end; 

procedure Tfxvogir.AfterConstruction; 
begin 
    inherited; 
    ComPort1 := TComPort.Create(ComPort1); 
    //tmrtimer := TTimer.Create(ComPort1); 
end; 

procedure Tfxvogir.BeforeDestruction; 
begin 
    inherited; 
    ComPort1.Free; 
    //tmrtimer.Free; 
end; 

function Tfxvogir.OpnaVog(const ComPort: WideString): WordBool; 
begin 
try 
    //tmrtimer.Enabled := false; 
    //tmrtimer.Interval := 100; 

    ComPort1.Port      := ComPort; 
    ComPort1.BaudRate     := br2400; 
    ComPort1.DataBits     := dbSeven; 
    ComPort1.StopBits     := sbOneStopBit; 
    ComPort1.Parity.Bits    := prEven; 
    ComPort1.FlowControl.FlowControl := fcNone; 

    if not ComPort1.Connected then 
    ComPort1.Open; 

    if ComPort1.Connected then 
    Result := True; 

    except 
    Result := False; 
    end; 
end; 

function Tfxvogir.LokaVog: WordBool; 
begin 
    try 
    if ComPort1.Connected then 
     ComPort1.Close; 

    Result := True; 
    except 
    Result := False; 
    end; 
end; 

function Tfxvogir.Vigt: WideString; 
begin 
    Result := g_rVigtun.VigtunGr; 
end; 

procedure Tfxvogir.ComPort1RxChar(Sender: TObject; Count: Integer); 
var 
    Str: string; 
    str1 : ansichar; 
    i : Integer; 
    cStafur : AnsiChar; 
begin 
    ComPort1.Readstr(Str, Count); 
    try 
    for i := 1 to count do begin 
     cStafur := AnsiChar(str[i]); 
     LesaSvar(cStafur); 
    end; 

    except 
    g_rVigtun.SvarTexti := 'Villa í tengingu'; 
    end; 
end; 

function Tfxvogir.SendaSkipun(const Inntak: WideString): WordBool; 
var 
    //I : Integer; 
    BCC : Integer; 
    sCommand : AnsiString; 
begin 
    //ATH höndla ef slökkt er á vog = ekkert svar berst 
    Result := False; 
    g_rVigtun := FrumstillaVigtun; 

    if Length(Inntak) < 1 then begin 
    g_rVigtun.SvarTexti := 'VILLA: Engin skipun til að senda.'; 
    exit(false); 
    end; 

    //Er þetta lögleg skipun if (rSending.Kaupsamn <> '') and (rSending.Kaupsamn[1] in ['K', 'V']) then begin 
    if not (Inntak[1] in ['C','G','M','O','R','T','W','Z']) then begin 
    g_rVigtun.SvarTexti := 'VILLA: ['+Inntak+'] er óþekkt skipun.'; 
    exit(false); 
    end; 

    g_rVigtun.Skipun := ansichar(Inntak[1]); 
    SamskiptiByrja; 
    g_StoduVel := svNyttSvar; 

    BCC := ReiknaBCC(Inntak); 
    //Skipun er alltaf á forminu 
    //<STX><[SKIPUN][aukatexti]><ETX><BCC> 
    sCommand := STX + Inntak + ETX + Chr(BCC); 

    //ATH ætti að hreinsa inntaks buffer hér ? 
    try 
    ComPort1.WriteStr(sCommand); 
    except 

    end; 
    Result := True; 
end; 

initialization 
    TAutoObjectFactory.Create(ComServer, Tfxvogir, Class_fxvogir, 
    ciMultiInstance, tmApartment); 
end. 
+1

어디에서 com ** Timeout constant **를 설정 했습니까? 왜 DLL인지, 왜 Uint와 DLL보다 먼저하지 않는가? –

답변

2
ComPort1.FlowControl.FlowControl := fcNone; 

. 장치가 온라인 상태이고 데이터를 수신 할 준비가되어 있음을 장치가 알 수 있도록 DTR 및 RTS 신호를 켜야합니다.

관련 문제