![]() |
Verwendung der Komponente: Timer
Ich verstehe nicht, warum das lesen und darstellen von Daten in einer procedure Timer1Timer stattfindet, entsprechend der Source, die ich eben fand.
Warum muss man die Timerzeit (100ms)ablaufen lassen, ehe man ein Byte lesen darf. Leider steht im Refernzhandbuch nur drin, was der Timer macht, nicht wann man ihn einsetzt, außer dem OnTimer Ereignis. Aber da steht ja nix davon in dieser Source. Bin eben noch Anfänger, total privat.
Delphi-Quellcode:
Ist das der übliche Weg?
procedure TForm1.Timer1Timer(Sender: TObject);
var Dat: Integer; begin while INBUFFER > 0 do begin Dat := ReadByte; MemoBinIn.Lines[LineBin] := MemoBinIn.Lines[LineBin] + IntToStr(Dat)+ ' '; if length (MemoBinIn.Lines[LineBin]) > 40 then begin MemoBinIn.Lines.add (''); LineBin := MemoBinIn.Lines.count; end; if Dat <> 10 then MemoTextIn.Lines[LineText] := MemoTextIn.Lines[LineText] + Chr(Dat); if Dat = 13 then begin MemoTextIn.Lines.add (''); LineText := LineText +1 end; if length (MemoTextIn.Lines[LineText]) > 25 then begin MemoTextIn.Lines.add (''); LineText := LineText +1 end; if INBUFFER > 500 then ClearBuffer; end; Wer hilft mir bitte auf die Sprünge? [edit=SirThornberry]code-tags durch delphi-tags ersetzt - Mfg, SirThornberry[/edit] |
Re: Verwendung der Komponente: Timer
Hi,
ich weiss ja nicht, wozu dieser Code dient - aber effizient ist er in der Tat nicht. Um was für ein Programm handelt es sich denn da ? Gruss |
Re: Verwendung der Komponente: Timer
Guten Morgen,
du hast das schon richtig erkannt. Timer1Timer wird entsprechend der Einstellung (in diesem Fall 100ms) ausgeführt. D.h. unabhängig welcher Code in der Procedure steht wird sie alle 100 ms aufgerufen. Der Code in der Prozedur liest ein Byte, und verarbeitet es im Memo (ganz grob :zwinker: ) Warum das lesen in dem Timer ausgeführt wird kann ich dir auch nicht sagen. Vieleicht hatte es hardwaretechnischen Gründe. Wenn ich deine Frage richtig interpretiert habe ob das immer so mit dem Timer sein muß, ein klares NEIN :zwinker: :hi: |
Re: Verwendung der Komponente: Timer
Das Problem ist hier, daß du einen Code von einem Programm hast und nicht weißt was dort warum passiert.
Wir haben hier immer nur Bruchstücke davon und wissen dagegen dann nicht was in den restlichen Programmteilen los ist, also können wir praktisch garnicht viel helfen und höchtens mal etwas raten. INBUFFER: also irgendwo anders wird da ein Puffer gefüllt und abhängig davon würde ich womöglich an dieser Stelle mal ansetzen ... denn ich würde da die Auswertung gleich mit starten. Und wenn das wegen 'ner Zeitkritschien Angelegenheit nicht geht, dann würde ich die Prozedur im Timer etwas optimieren ... eventuell einfach dadurch, daß gleich mehrere/alle Bytes ausgewertet werden. |
Re: Verwendung der Komponente: Timer
Naja, die Auswertung beschränkt sich auf Zeilenumbrüche....
ob das nicht nur ein Log oder sowas ist ? |
Re: Verwendung der Komponente: Timer
Zitat:
Die Byte routine ist in einerm Modul rscom.pas definiert. Da stehen Sachen, die nach API von MS klingen. Es geht um eine Kommunikation mit einem AVR ATtiny2313. Der sendet bytes die in einem Memofenster dargestellt werden. Eigentlich würde ich gerne bytes vom uC in einer Warteschleife empfangen, aber aus der muss ich ja irgendwie auch rauskommen können; also hat der Schreiber dieser Routine so was wie einen Softwareinterrupt gemacht, denk ich, nachdem ich jetzt weiss, dass mit 1o Hz abgefragt wird. Im Prinzip ist es so ähnlich wie ein Hyperterminal. Ich nehme an, dass ein byte irgendwann eintrifft und erst mit Readbyte() abgeholt wird. Was passiert eigentlich, wenn es nicht abgeholt wurde und ein 2. byte eintrifft? Steckt dann alles, oder wird das 1. byte verworfen. Das sind Innereien von denen ich keine Ahnung habe. Was der uC dann machen würde, weiss ich genau, aber Delphi und API ist mir unklar. Muss ich das überhaupt wissen? Zur Verdeutlichung noch einige Zeilen aus der rscom.pas.
Code:
Hat jemand einen Vorschlag für mich, wie ich das anders machen könnte?
function INBUFFER (): DWORD;
var Comstat: _Comstat; Errors: DWORD; begin if ClearCommError (PortHandle, Errors, @Comstat) then INBUFFER := Comstat.cbInQue else INBUFFER := 0; end; function READBYTE(): Integer; var Dat: Byte; BytesRead: DWORD; begin ReadFile(PortHandle,Dat,1,BytesRead,NIL); if BytesRead = 1 then Result:=Dat else Result := -1; end; Vielleicht ein Vorschlag, wenn ich nicht zu aufdringlich bin, von dir, haentschman? Ich danke jedenfalls für die rege Beteiligung. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz