Entwickler-Ecke

Sonstiges (Delphi) - Zugriff auf serielle Schnittstelle mit TComPort4Beta in Win7


molotov - Di 11.05.10 16:53
Titel: Zugriff auf serielle Schnittstelle mit TComPort4Beta in Win7
Folgendes Problem:

System: Win 7 Professional (Englisch)

In meiner Anwendung (läuft als Service) kommen keine Daten über die COM-Schnittstelle an. Mein Service ist unter Delphi 2009 entwickelt, zum Portzugriff habe ich die Komponente TComPort4Beta verwendet. Windows Firewall und UAC sind deaktiviert. Selbes Service verhält sich unter XP Professional einwandfrei.

Wenn ich per Hyperterminal (von XP kopiert) auf die COM-Schnittstelle schaue, kommen die Daten auch einwandfrei an.

Was kann daran Schuld sein dass ich keine Daten in meiner Applikation erhalte?

Edit:
Ich arbeite dabei mit einem TComDataPacket welches mit dem kommunizierenden ComPort verknüpft ist und erwarte mir Daten in dessen OnPacket- Routine

Edit:
Problem ein bißchen eingeschränkt: Hänge ich einen USB/Seriell-Konverter ran und probiere es mit dessen COM-Port funktioniert es, d.h. die Anwendung erhält die Daten. Über die "echte", interne serielle Schnittstelle funktionierts nicht.


Moderiert von user profile iconNarses: Topic aus VisualCLX (Component Library for Cross Platform) verschoben am Di 11.05.2010 um 20:38


bummi - Fr 14.05.10 10:27

Wir haben mit CPort sehr gute Erfahrungen gemacht ( http://comport.sf.net/ )
Die Optionen sind hier allerdings so umfangreich daß es sicht lohnt diverse abgeleitet Klassen mit sinvollen Grundeinstellungen zu erstellen.

MfG
Bummi


Chemiker - Fr 14.05.10 14:34

Hallo molotov,

zum Programmtesten hat sich bei mir eigentlich COM0COM (sind virtuelle COM Schnittstellen die über ein virtuelles 0-Modemkabel verbunden sind) bewährt, damit hat man die
möglichkeit spezielle Testbedingungen zu erstellen um Fehler in der Hardware erst mal auszuschließen.

Bis bald Chemiker


bummi - Fr 14.05.10 14:39

Hallo Chemiker,

ich verwende selbst gerne COM0COM
allerding ist es zu tolerant bei Timimgproblemen mit realen COM-Schnittstellen,
alos wa unter COM0COM funktioniert muß0 noc lange nicht mit reellen Geräten funtionieren.

MfG
Bummmi


molotov - Do 20.05.10 10:44

Danke für eure Antworten.

@bummi: "Wir haben mit CPort sehr gute Erfahrungen gemacht ( comport.sf.net/ ) " - Dies ist ja genau meine TComPort4Beta ?

Ich habe keine andere TComPort-Version gefunden, die unter Delphi 2009 laufen würde.
Weiterhin habe ich unter Windows 7 das Problem dass ich mit einem TComDataPacket arbeite, da meine zu erwartende Message ein bestimmtes Start- bzw. Stopzeichen enthält und dessen OnPacket - Callback nie drankommt.
Diverse Einstellmöglichkeiten habe ich schon druchprobiert, leider ohne Erfolg.

Wenn ich mit dem OnRxChar Callback des TComPort arbeite, dann erhalte ich Daten. Leider kann ich mit diesem Callback nicht vernünftig arbeiten. Oder kann man auch hier irgendwie festlegen, dass erst ab einem gewissen Startzeichen begonnen werden soll? Händisches Ausprogrammieren einer solchen Funktionalität habe ich leider nicht zu Stande gebracht.

Vielleicht hat noch jemand Ideen, die mir weiterhelfen könnten.

Zur Anmerkung meiner Anwendung: Ich bekomme alle 2 - 5 Sekunden ca. eine Nachricht einer unkonstanten Länge (~30-40 Byte) und möchte diese ab einem Startbyte (Linefeed) aufzeichnen und weiterverarbeiten. Bis dato (unter Windows XP) hat dies mit dem TComDataPacket einwandfrei funktioniert.


bummi - Do 20.05.10 11:03

Ich habe im Anhang was drin was ungefähr zu Deinen Anforderungen passen müßte, der Cportkram ist etwas Zicking in den Einstellungen.
passen für Dich müßte : Tx2DCodeLeser


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
unit x2DCodeLeser;
// 20090818 by Thomas Wassermann - explido-software
// für Leuze electronic handleser 6300

interface
uses Classes,Cport,CPortTypes,Forms,BaseSerial;



Type Tx2DCodeLeser=Class(TBaseSerial)

    Private
      FInput:ANSIString;
      FBarcode:ANSIString;
      FOnBarcodeRead:TNotifyEvent;
    Procedure ParseOut;

    Public Constructor Create(AOwner:TComponent);Override;
    procedure InternalDataAvail;override;
    Published
    Property Barcode:ANSIString read FBarcode Write FBarcode;
    Property OnBarcodeRead:TNotifyEvent REad FOnBarcodeRead Write FOnBarcodeRead;
End;


procedure Register;

implementation
uses
  SysUtils;
resourceString
  {$IFDEF GER}
  {$I GER\BaseSerial.restxt}
  {$ENDIF}

  {$IFDEF EN}
  {$I EN\BaseSerial.restxt}
  {$ENDIF}

{ THoehenmessgeraet }


procedure Register;
begin
  RegisterComponents('Kommunikation', [Tx2DCodeLeser]);
end;


Procedure Tx2DCodeLeser.InternalDataAvail;
begin

  While Pos(#13#10,Inbuffer)>0 do
    begin
    FInput := Copy(Inbuffer,1,Pos(#13#10,Inbuffer)-1);
    Inbuffer := Copy(Inbuffer,Pos(#13#10,Inbuffer)+2,Length(Inbuffer));
    if Length(FInput)>0 then ParseOut;
    end;

end;


constructor Tx2DCodeLeser.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
    // 20090818 by Thomas Wassermann
    CustomBaudRate := 9600;
    BaudRate := br9600;
    Parity.Bits := prNone;
    StopBits := sbOneStopBit;
    DataBits := dbEight;
    Events := [evRxChar, evError, evRLSD];
    Buffer.InputSize := 8192;
    Buffer.OutputSize := 8192;
    FlowControl.OutCTSFlow := True;
    FlowControl.OutDSRFlow := False;
    FlowControl.ControlDTR := dtrEnable;
    FlowControl.ControlRTS := rtsHandshake;
    FlowControl.XonXoffOut := False;
    FlowControl.XonXoffIn := False;
    Timeouts.ReadInterval := 10;
    Timeouts.WriteTotalMultiplier := 5000;
    Timeouts.WriteTotalConstant := 0;
end;

Procedure Tx2DCodeLeser.ParseOut;
begin
   Fbarcode := FInput;
   try
   if Assigned(FOnBarcodeRead) then FOnBarcodeRead(self);
   except
   end;
end;





end.


und die Basisklasse dafür


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
264:
265:
266:
267:
unit BaseSerial;
// 20090804 by Thomas Wassermann - explido-software
// OnDataVail nur verfügbar wenn UseBigBuffer=true >> dann darf ONRxChar nicht verwendet werden
interface
uses Classes,CPort,Forms,PortConfigp,CPortTypes;


type
  tserDirection= (serIn,serOut);
  tonDebug = procedure(sender : tObject; Direction:tserDirection;content:ANSIString) of Object;

Type TBaseSerial=Class(TComport)
    Private
      FLineOpen:Boolean;
      FLastError:Integer;
      fOnError:TnotifyEvent;
      fOnDebug:tonDebug;
      FInBuffer:AnsiString;
      FdisplayName:AnsiString;
      fOnDataAvail: TnotifyEvent;
      FErrorLeadSign:String;
      FErrorCodeLen:Integer;
      FLastErrorCodeFMT: String;
      FUseBigBuffer:Boolean;
      FConfigured:Boolean;
      Function GetFixLen(len:Integer; z:Integer ;Fill:Char;LEading:Boolean=true):ANSIString;overload;
      Function GetFixLen(len:Integer; Const s:ANSIString;Fill:Char;LEading:Boolean=true):ANSIString;overload;


      procedure SetLastError(const Value: Integer);
      procedure setOnError(const Value: TnotifyEvent);
      procedure setOnDebug(const Value: tonDebug);
      function  GetLastErrorCodeFMT: String;
      procedure ComPortRxChar(Sender: TObject; Count: Integer);
      function GetLineOpen: Boolean;
      procedure setOnDataAvail(const Value: TnotifyEvent);


    Public
      Constructor Create(aOwner : tComponent); override;
      Destructor Destroy; override;
      Function CloseLine:Integer;
      Function GetLastErrorString:Stringvirtual;
      function GetErrorKategory: Stringvirtual;
      function GetIsError: Boolean;virtual;
      Function OpenLine:Integer;
      Function SendCommand(const Command:ANSIString):Boolean;
      procedure InternalDataAvail; virtual ; abstract;
      Procedure ConfigurePort;
    Published
      Property DisplayName:AnsiString read FdisplayName Write FdisplayName;
      Property InBuffer:AnsiString read FInBuffer write FInBuffer;
      Property LastError:Integer read FLastError Write SetLastError;
      Property LineOpen:Boolean read GetLineOpen;
      Property ErrorKategory:String Read GetErrorKategory;
      property OnDataAvail : TnotifyEvent read fOnDataAvail write setOnDataAvail;
      property OnDebug : tonDebug read fonDebug write setOnDebug;
      property OnError : TnotifyEvent read fOnError write setOnError;
      Property ErrorLeadSign:String read FErrorLeadSign Write FErrorLeadSign;
      Property ErrorCodeLen:Integer read FErrorCodeLen Write FErrorCodeLen;
      Property LastErrorCodeFMT:String  read GetLastErrorCodeFMT;
      Property IsError:Boolean read GetIsError;
      Property UseBigBuffer:Boolean read FUseBigBuffer write FUseBigBuffer;
      Property Configured:Boolean Read  FConfigured write FConfigured;
End;


procedure Register;

implementation
uses
  SysUtils, Controls;
resourceString
  {$I Lang.inc}

  {$IFDEF GER}
  {$I GER\BaseSerial.restxt}
  {$ENDIF}

  {$IFDEF EN}
  {$I EN\BaseSerial.restxt}
  {$ENDIF}

{ TBaseSerial }


procedure Register;
begin
  RegisterComponents('Kommunikation', [TBaseSerial]);
end;


Function TBaseSerial.GetFixLen(len:Integer; z:Integer ;Fill:Char;LEading:Boolean=true):ANSIString;
begin
  Result := GetFixLen(len  , IntToStr(z), Fill,Leading);
end;


Function TBaseSerial.GetFixLen(len:Integer; Const s:ANSIString;Fill:Char;LEading:Boolean=true):ANSIString;
begin
  if length(s)<len then
    begin
      if LEading  then
        begin
          if pos('-',s)=1 then
            begin
            Result := '-' + StringOfChar(Fill,len - Length(s)) + Copy(s,2,Length(s));
            end
          else
            begin
            Result := StringOfChar(Fill,len - Length(s)) + s
            end;
        end
      else
        begin
        Result := s + StringOfChar(Fill,len - Length(s))
        end;
    end else Result := s;
end;

function TBaseSerial.GetIsError: Boolean;
begin
   Result := LastError<>0;
end;

function TBaseSerial.CloseLine: Integer;
begin
  Connected := false;
  Result := 0;
end;


procedure TBaseSerial.ConfigurePort;
begin
  With TPortConfigF.Create(self) do
     try
       Caption := DisplayName;
       PortEdit.Text := Port;
       StopbitsEdit.ItemIndex := Ord(Stopbits);
       ParityEdit.ItemIndex := Ord(Parity.Bits);
       BaudrateEdit.ItemIndex := Ord(baudrate);
       DatabitsEdit.ItemIndex := Ord(databits);
       Showmodal;
       if Modalresult=mrok then
          begin
             Port := PortEdit.Text;
             Stopbits := TStopBits(StopbitsEdit.ItemIndex);
             Parity.Bits := TParityBits(ParityEdit.ItemIndex);
             baudrate := TBaudrate(BaudrateEdit.ItemIndex);
             databits := TDataBits(DatabitsEdit.ItemIndex);
          end;
     finally
       Free;
     end;
  end;

constructor TBaseSerial.Create(aOwner: tComponent);
begin
  inherited create(aOwner);
  FUseBigBuffer := true;
  OnRxChar := ComPortRxChar;
end;

destructor TBaseSerial.Destroy;
begin
  inherited;
end;


procedure TBaseSerial.ComPortRxChar(Sender: TObject; Count: Integer);
var
  s:AnsiString;
begin
  if FUseBigBuffer then
    begin
    ReadStr(s,Count);
    FInBuffer := FInBuffer + s;
    if Assigned(fOnDebug) then fOnDebug(self,serIn,s);
    InternalDataAvail;
    if Assigned(fOnDataAvail) then fOnDataAvail(self);
    end;
end;

function TBaseSerial.GetErrorKategory: String;
begin
      case LastError of
       -1000..-1: Result := SerialError;
               0: Result := '';
       else Result := '';
      end;

end;

function TBaseSerial.GetLastErrorCodeFMT: String;
begin
      Result := FErrorLeadSign + GetFixLen(FErrorCodeLen , LastError,'0',true);
end;

function TBaseSerial.GetLastErrorString: String;
begin
   case FLastError of
      -100:  Result := SerErr_100;
        -1:  Result := SerErr_1;
         0:  Result := SerErr0;
   end;
end;

function TBaseSerial.GetLineOpen: Boolean;
begin
   Result := Connected;
end;



function TBaseSerial.OpenLine: Integer;
begin

       if not  Configured then
          begin
             LastError := -99;
             Result := LastError;
             Exit;
          end;
       try
       Connected := true;
       REsult := 0;
       Except
       Result := -1;
       end;

end;

Function TBaseSerial.SendCommand(const Command: ANSIString):Boolean;
begin
  if Assigned(fonDebug) then fonDebug(Self,serOut,Command);
  Result := WriteStr(Command)=Length(Command);
end;






procedure TBaseSerial.SetLastError(const Value: Integer);
begin
  FLastError := Value;
  if (FLastError<>0and Assigned(fOnError) then  fOnError(Self);
end;


procedure TBaseSerial.setOnDataAvail(const Value: TnotifyEvent);
begin
   fOnDataAvail := Value;
end;

procedure TBaseSerial.setOnDebug(const Value: tonDebug);
begin
  fonDebug := Value;
end;

procedure TBaseSerial.setOnError(const Value: TnotifyEvent);
begin
  fOnError := Value;
end;


end.


molotov - Do 20.05.10 11:16

Danke erstmal. Die Unit PortConfigp fehlt mir da noch.

Hättest du vielleich auch noch ein Beispiel für die Verwendung des Tx2DCodeLeser?

Danke im Voraus!


bummi - Do 20.05.10 11:35


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
irgendwo im code:

if DMF.x2DCodeLeser.Configured then DMF.x2DCodeLeser.OpenLine;



procedure TDMF.x2DCodeLeserBarcodeRead(Sender: TObject);
begin
  {$IFDEF DEBUG}
  Add2LogFile('DBG','Matrixcode gelesen: ' + x2DCodeLeser.Barcode);
  {$ENDIF}
   try
   if Assigned(WorkingF) then WorkingF.MatrixCode := x2DCodeLeser.Barcode;
   except end;
end;



portconfigp.dfm

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
object PortConfigF: TPortConfigF
  Left = 0
  Top = 0
  BorderStyle = bsDialog
  Caption = 'PortConfigF'
  ClientHeight = 235
  ClientWidth = 231
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object Label1: TLabel
    Left = 24
    Top = 27
    Width = 20
    Height = 13
    Caption = 'Port'
  end
  object Label2: TLabel
    Left = 24
    Top = 54
    Width = 44
    Height = 13
    Caption = 'Baudrate'
  end
  object Label3: TLabel
    Left = 24
    Top = 81
    Width = 39
    Height = 13
    Caption = 'Stopbits'
  end
  object Label4: TLabel
    Left = 24
    Top = 108
    Width = 40
    Height = 13
    Caption = 'Databits'
  end
  object Label5: TLabel
    Left = 24
    Top = 135
    Width = 28
    Height = 13
    Caption = 'Parity'
  end
  object PortEdit: TEdit
    Left = 80
    Top = 24
    Width = 121
    Height = 21
    TabOrder = 0
    Text = 'PortEdit'
  end
  object BaudrateEdit: TComboBox
    Left = 80
    Top = 51
    Width = 121
    Height = 21
    Style = csDropDownList
    ItemHeight = 13
    TabOrder = 1
    Items.Strings = (
      'Custom'
      '110'
      '300'
      '600'
      '1200'
      '2400'
      '4800'
      '9600'
      '14400'
      '19200'
      '38400'
      '56000'
      '57600'
      '115200'
      '128000'
      '256000')
  end
  object StopbitsEdit: TComboBox
    Left = 80
    Top = 78
    Width = 121
    Height = 21
    Style = csDropDownList
    ItemHeight = 13
    TabOrder = 2
    Items.Strings = (
      '1'
      '1.5'
      '2')
  end
  object DatabitsEdit: TComboBox
    Left = 80
    Top = 105
    Width = 121
    Height = 21
    Style = csDropDownList
    ItemHeight = 13
    TabOrder = 3
    Items.Strings = (
      '5'
      '6'
      '7'
      '8')
  end
  object ParityEdit: TComboBox
    Left = 80
    Top = 132
    Width = 121
    Height = 21
    Style = csDropDownList
    ItemHeight = 13
    TabOrder = 4
    Items.Strings = (
      'None'
      'Odd'
      'Even'
      'Mark'
      'Space')
  end
  object BitBtn1: TBitBtn
    Left = 24
    Top = 176
    Width = 83
    Height = 25
    DoubleBuffered = True
    Kind = bkCancel
    ParentDoubleBuffered = False
    TabOrder = 5
  end
  object BitBtn2: TBitBtn
    Left = 118
    Top = 176
    Width = 83
    Height = 25
    DoubleBuffered = True
    Kind = bkOK
    ParentDoubleBuffered = False
    TabOrder = 6
  end
end


portconfigp.pas

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
// 200909 by Thomas Wassermann
unit PortConfigp;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons;

type
  TPortConfigF = class(TForm)
    PortEdit: TEdit;
    Label1: TLabel;
    BaudrateEdit: TComboBox;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    StopbitsEdit: TComboBox;
    DatabitsEdit: TComboBox;
    ParityEdit: TComboBox;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  PortConfigF: TPortConfigF;

implementation

{$R *.dfm}

end.


molotov - Do 20.05.10 12:37

user profile iconbummi hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
irgendwo im code:

if DMF.x2DCodeLeser.Configured then DMF.x2DCodeLeser.OpenLine;



procedure TDMF.x2DCodeLeserBarcodeRead(Sender: TObject);
begin
  {$IFDEF DEBUG}
  Add2LogFile('DBG','Matrixcode gelesen: ' + x2DCodeLeser.Barcode);
  {$ENDIF}
   try
   if Assigned(WorkingF) then WorkingF.MatrixCode := x2DCodeLeser.Barcode;
   except end;
end;




Das versteh ich noch nicht ganz.

Ich füge also deinen Code dazu, definiere in meiner Anwendung eine Variable vom Typ Tx2DCodeLeser und führe z.B. beim Start meiner Anwendung OpenLine aus.
Blöde Frage? Was hat es mit

Delphi-Quelltext
1:
procedure TDMF.x2DCodeLeserBarcodeRead(Sender: TObject);                    

auf sich? Ist das die Überladung von OnBarcodeRead? Bin in diesem Zusammenhang nicht sehr bewandert. Kann ich dem Ereignis irgendwie mitteilen, dass ab einem bestimmen Zeichen bzw. zwischen Start- und Stopzeichen gelesen werden soll?
Danke für deine umfangreiche Hilfe!


bummi - Do 20.05.10 12:42

Ach so , sorry sind Komponenten ....
Du kannst sie zwar dynamisch mit

Delphi-Quelltext
1:
2:
3:
4:
5:
var
myR:Tx2DCodeLeser;

myR:=Tx2DCodeLeser.Create(self);
myR.OnBarcodeRead := blafasel

verwenden.

Mach Dir ein Neues Package für die dateien hinzu und installiere ...

Dann hast unter Kommunikation zwei Komponenten die Du auf ein Form oder Datenmodul schmeißen kannst..

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt


molotov - Do 20.05.10 12:49

Ok, danke.

Nochmal die Frage bzgl. Art des Auslesens von Daten: Kann ich hier in der Form arbeiten wie mit den TComDataPacket, wo ich einen StartString und einen StopString definieren kann?


bummi - Do 20.05.10 13:07

sagt mir jetzt nichts ...

aber pass doch einfach "Tx2DCodeLeser.InternalDataAvail" an


molotov - Do 20.05.10 13:36

Danke auf jeden Fall für deine Hilfe.
Ich bin aber leider in großer Zeitnot und möchte mich nicht auf große Experimente einlassen.

Das ganze Projekt ist grundsätzlich schon mit der Kombination Delphi 7 + TComPort 3.1 problemlos gelaufen.

Es muss doch irgendwie auch mit TComPort4Beta + Delphi 2009 funktionieren. Das Release ist schließlich auch schon einige Zeit alt. Hat den niemand Erfahrung mit dem TComDataPacket-Element. Das Problem ist einfach dass das OnPacket-Ereignis nie aufgerufen wird. Die Parameter StartString und StopString werden jedoch im Code auf #10 gesetzt, welches auch vom Sender am Anfang geschickt wird.


Delphi-Quelltext
1:
2:
ComDataPacket1.StartString:=chr(ini.ReadInteger('ComProtocol1','StartOfMessageChar',10));
ComDataPacket1.StopString:=chr(ini.ReadInteger('ComProtocol1','EndOfMessageChar',10));


bzw.


Delphi-Quelltext
1:
2:
ComDataPacket1.StartString:=#10;
ComDataPacket1.StopString:=#10;


habe ich in meinen Test verwendet.

Folgende Eigenschaften sind noch gesetzt

IncludeStrings: true (auch schon mit false probiert)
Size: 0 (da die Größe ja variabel ist)
CaseInsensitive: false
BufferSize: 1024

Edit:

Eine Kleinigkeit die mir aufgefallen ist: Ich habe Start und Stopstring auf ein anderes Zeichen geändert, welches öfters in der Übertragung vorkommt. Danach habe ich 1 x etwas erhalten, die Zeichen wurden dabei aber anders dargestellt:

- Leerzeichen wurde zu ?
- , wurde zu ;
- Zahlen blieben anscheinend gleich

Kann es sein, dass Delphi 2009 durch Unicodeunterstützung etwas umwandelt und dadurch mein #10 das der Sender abschickt auch geändert wird?

Moderiert von user profile iconNarses: Eigenzitat-Beitrag gelöscht.

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

Eine Kleinigkeit die mir aufgefallen ist: Ich habe Start und Stopstring auf ein anderes Zeichen geändert, welches öfters in der Übertragung vorkommt. Danach habe ich 1 x etwas erhalten, die Zeichen wurden dabei aber anders dargestellt:

- Leerzeichen wurde zu ?
- , wurde zu ;
- Zahlen blieben anscheinend gleich

Kann es sein, dass Delphi 2009 durch Unicodeunterstützung etwas umwandelt und dadurch mein #10 das der Sender abschickt auch geändert wird?


Chemiker - Do 20.05.10 14:49

Hallo molotov,

molotov hat folgendes geschrieben:
Kann es sein, dass Delphi 2009 durch Unicodeunterstützung etwas umwandelt und dadurch mein #10 das der Sender abschickt auch geändert wird?


Das wird wahrscheinlich Dein Problem sein. Delphi 2009 wandelt zwar nichts um, sonder wenn in der Komponente mich char zum Beispiel gearbeitet worden ist (statt ein Byte zu nehmen) so besteht dieses Char nun unter Delphi 2009 aus 2 Byte, diese serielle Schnittstelle arbeitet aber mit einem Byte.

Die Lösung für Dich währe die Komponente so zu ändern das mit einem Byte gearbeitet wird.

Bis bald Chemiker


molotov - Do 20.05.10 15:09

Moderiert von user profile iconNarses: Komplett-Zitat des letzten Beitrags entfernt.

Danke für den Hinweis, glaube aber mittlerweile nicht, dass das der Grund ist. Ich habe noch weitere seltsame Phänomene. Wenn ich an meinem Zielsystem wo ich die Daten erhalte per Seriell-USB-Adapter arbeite, kommen die Daten zeitweise richtig an - mein Start- bzw. Stopzeichen: LF kommt in diesem Fall immer an - Zahlen werden teilweise zu ? konvertiert.
Wenn ich direkt an der seriellen am Rechner empfange bekomme ich nie Daten. Geschwindigkeit und andere Port-Einstellungen sind komplett identisch!

Edit:

Neueste Erkenntnis: Delphi 2009 ist definitiv nicht Schuld, dass die Zeichen nicht korrekt ankommen. Meine OnPacket - Routine wird in Windows XP korrekt aufgerufen und siehe da - alle Zeichen sind einwandfrei übertragen worden. Also ist irgendwas am Windows 7 selbst Schuld an der ganzen Misere.


molotov - Do 20.05.10 19:50

Moderiert von user profile iconNarses: Doppelposting entfernt.

@bummi
Kann es sein, dass dein vorher geposteter Code etwas im Delphi ändert?
Die Sache ist nämlich die: Ich habe die Kommunikation nun so hinbekommen (mit TComPort4) dass das Ganze recht stabil läuft.

Mein Prozess läuft als Service und startet einen OPC-Server, auf den eine Client-Anwendung zugreift. Seit kurzem habe ich das seltsame Problem, dass ich nicht mehr auf diesen OPC-Server zugreifen kann. Ich habe die aktuell bei mir versionierte Exe ausprobiert und diese funktioniert in Zusammenhang mit dem Zugriff auf den OPC-Server. Wenn ich nun diese Version neu compiliere (ohne jegliche Code-Änderungen gegenüber der funktionierenden Anwendung), so funktioniert diese nicht mehr. Ich habe mal was gelesen, das war auch der Grund warum ich auf Delphi 2009 umgestiegen bin, dass erst ab gewissen Delphi-Versionen es möglich ist, ein Service so zu compilieren, damit es unter Windows 7 lauffähig ist.

Kann es sein, dass sich irgendetwas in den grundlegenden Delphi-Einstellungen geändert hat?
Ich bin nun schon recht verzweifelt, hätte ich doch eine Applikation die grundsätzlich von der Funktionalität passen würde und jetzt kommt dieses seltsame Verhalten hinzu.


molotov - Fr 21.05.10 10:44

@bummi
Sorry, da war etwas anderes Schuld. Hab dieses Problem gelöst!