| Autor |
Beitrag |
molotov
      
Beiträge: 24
|
Verfasst: Di 11.05.10 16:53
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 Narses: Topic aus VisualCLX (Component Library for Cross Platform) verschoben am Di 11.05.2010 um 20:38
|
|
bummi
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: Fr 14.05.10 10:27
Wir haben mit CPort sehr gute Erfahrungen gemacht ( 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
      
Beiträge: 194
Erhaltene Danke: 14
XP, Vista 32 Bit, Vista 64 Bit, Win 7 64 Bit, Win 10, Win 11
BDS 2006, RAD Studio 2009+C++, Delphi 13, VS 2010 Prof.
|
Verfasst: 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
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: 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 
      
Beiträge: 24
|
Verfasst: 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
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: 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
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;
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}
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); 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
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; 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:String; virtual; function GetErrorKategory: String; virtual; 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}
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<>0) and 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 
      
Beiträge: 24
|
Verfasst: 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
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: 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
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
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:
| 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 public end;
var PortConfigF: TPortConfigF;
implementation
{$R *.dfm}
end. |
|
|
molotov 
      
Beiträge: 24
|
Verfasst: Do 20.05.10 12:37
bummi hat folgendes geschrieben : | 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
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: 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 Narses: Delphi-Tags hinzugefügt
|
|
molotov 
      
Beiträge: 24
|
Verfasst: 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
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: Do 20.05.10 13:07
sagt mir jetzt nichts ...
aber pass doch einfach "Tx2DCodeLeser.InternalDataAvail" an
|
|
molotov 
      
Beiträge: 24
|
Verfasst: 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 Narses: Eigenzitat-Beitrag gelöscht.
--- Moderiert von Narses: 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
      
Beiträge: 194
Erhaltene Danke: 14
XP, Vista 32 Bit, Vista 64 Bit, Win 7 64 Bit, Win 10, Win 11
BDS 2006, RAD Studio 2009+C++, Delphi 13, VS 2010 Prof.
|
Verfasst: 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 
      
Beiträge: 24
|
Verfasst: Do 20.05.10 15:09
Moderiert von Narses: 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 
      
Beiträge: 24
|
Verfasst: Do 20.05.10 19:50
Moderiert von Narses: 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 
      
Beiträge: 24
|
Verfasst: Fr 21.05.10 10:44
@bummi
Sorry, da war etwas anderes Schuld. Hab dieses Problem gelöst!
|
|
|