Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Delphi 6.0 mit TSeriel Problem mit Abrufen der Seriellen Schnittstelle

Empfohlene Antworten

Veröffentlicht

Hallo,

da tempoär die Suchfunktion deaktiviert wurde, ich aber schnellstmöglich eine Lösung benötige eröffne ich einfach mal ein neues Thema.

Hintergrund:

- Bekomme Werte über die Serielle Schnittstelle.

- Zum ansteuern dieser benotze ich die TSerial Komponente.

Problem:

- Scheinbar stehen bei mir zuviele Werte zeitgleich an der Schnittstelle. Sodass ich ständig durch die Event-Prozedur durchlaufe. Ich hoffe mit dem Quellcode ist mein Prob klarer zu sehen.

Quellcode:


procedure TForm_main.Serial1RxData(Sender: TObject);   // Hier sollte das Programm nur durchlaufen, wenn neue Daten am Port anstehen.

var 

in_char                                 : char;

i                                            : integer;

str                                        : string;

Recvread                              : boolean; 

empfpuffer                            : array [0..2000] of char;   

recvlength                            : integer;  


begin

 i:=0; str:='';

  Serial1.ZapTXQueue;

  while Serial1.rxwaiting>0 do begin

    while Serial1.ReadChar(in_char) > 0 do begin  // Solange wie ein Zeichen noch ansteht

      CopyMemory(@empfpuffer[i],@in_char,1);  // <--- PROBLEM  Hier werden nun alle Werte in den empfangspuffer geschreiben. Es sollte aber nur der letzte aktuelle hineingeschreien werden. Eigentlich dürfte auch nur dieser an der Schnitstelle anstehen

      inc(i);

      Recvread:=true;

      edit1.text:=booltostr(recvread);

    end;

  end;

  if i>0 then begin

    recvlength:=i;

  end;


  Serial1.ZapRXQueue;

  Recvread:=False;

  edit1.text:=booltostr(recvread);

end;

Mein Problem ist also, dass nicht immer nur der letzte aktuelle Wert an Port ansteht. Kann mir einer Helfen?

MVG

need-some-blood

hm... also entweder löschst du die Werte nach dem Empfangen nicht (ZapRXQueue funktioniert nicht) oder der Fehler liegt nicht an deinem Programm, sondern die Daten liegen eben die ganze Zeit an der Schnittstelle an... :confused:

Edit:

Ach ja, das edit1.text:=booltostr(recvread); bringt dir nicht viel IMHO. In der Schleife wird es so schnell durchlaufen, dass du keinen Unterschied bemerkst (falls die Schleife mehrfach durchlaufen wird), und zum anderen wird direkt am Ende ein edit1.text:=booltostr(False); ausgegeben. Das steht so schnell da da merkst du das obere True auf jeden Fall nicht. Die serielle Schnittstelle mag zwar relativ langsam sein, aber so langsam auch wieder nicht ;)

Dank dir. Die Selbstbestätigung brauchte ich jetzt. Hab schon an meiner Programmierkunst gezweifelt. Jetzt muss ich nur nen Weg finden damit ich testen kann ob ZapRXQueue funktioniert. Wenn es funzt, dann darf ich meinem Chefprogrammierer erklären, das er seinen DOS-Treiber mal checken soll. *grein*

Vielen Dank soweit.

PS:

Zeile "edit1.text:=booltostr(recvread); " war zum testen ob das Prog überhaupt aus der while-schleife rausspringt. Also nur eine Test-Leiche, die ich übersehen habe.

MVG

need-some-blood

Hallo,

was mir gerade aufgefallen ist:

vielleicht solltest du direkt nach dem lesen der Daten (Serial1.ReadChar) die Daten an der Schnittstelle löschen? also in der While Schleife das ZapRXQueue aufrufen, nciht danach.

Ich weiss jetzt nicht wie es mit den Daten an der Schnittstelle ist, aber wenn du sie nur liest und nicht löschst sind sie ja noch da... Endlosschleife?

Nur so ne Idee die ich gerade hatte...

So habe mir gestern mal Gedanken zu dem Problem gemacht. Die Daten werden an der Schnittstelle wieder gelöscht. Ich lese ja ständig Werte ein, und diese sind verschieden.

Also muss es woanders liegen.

MVG

need-some-blood

So, nur damit ihr ein wenig auf dem laufendem bleibt. Nachdem ich nun keine LKust mehr hatte, das Problem zu suchen, habe cih es umgangen. Lese nun einfach alle Werte in einen String und maskiere mir meien einzelnen Werte dann aus.

Eigentlich nur "Nice to know"

MVG

need-some-blood

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.