Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Befehle puffern? Langsame verbindungen? (https://www.delphipraxis.net/106433-befehle-puffern-langsame-verbindungen.html)

snow 10. Jan 2008 22:06


Befehle puffern? Langsame verbindungen?
 
hallo

Ich hab folgendes Problem.

Ich steuere Meine Modelleisenbahn mit Delphi. Ich hab sie an COM-1 angeschlossen und via Synaser eine Verbindung aufgebaut. Das klappt auch ganz gut. (ich kann loks steuern, rückmelder abfragen, weichen schalten, Alles AN/AUS schalten).

So nun komm ich zu dem problem, dass die geschwindigkeit meins Interfaces(Märklin 6050) gerade einmal 2400bit/s beträgt.
Solange die Modellbahn manuell(von Hand) gesteuert wird ist dass kein Problem. Aber wenn ich eine Automatik steuerung probiere, dann komm ich zu dem problem, dass wenn ich einen Befehl sende, und gleich danach einen 2. Befehl sende, dass er dann nur den 1. Befehl an das Interface überträgt.

Der 2. Verschwindet im Digitalen-Nirgendwo.

es gibt dazu auch eine ganz einfache erklärung:

Wenn das Interface grad net kann, dann setz es CTS auf ON. Meinem PC scheint das aber gar nicht zu interressieren.

Ich kontrolliere natürlcih vor jedem Senden die CTS leitung. Doch auch hier hab ich dass problem, dass ich zwar das ergebniss true bekomme.(also dass ich grad net senden darf), aber ich weis net wohin dann mit dem Befehl. Ich müsste ihne in eine Art Warteschleife stecken und wenn das Interface dann mal wider kann dann müsste ich die Warteschleife abarbeiten.

Hat jemand Tipps für mich wie man so eine Warteschleife programmieren kann?

Gruß snow


PS:// Die wartescheife bräuchte auch ein überlauf-event.(damit die Differrenz zwischen Befehlen und ausführen zu groß wird).

turboPASCAL 11. Jan 2008 07:18

Re: Befehle puffern? Langsame verbindungen?
 
* Erstelle dir ein Array mit X Elementen
* Erstelle dir ein extra Thread zur Verarbeitung der Signale usw.

In dem Thread kannst du zB. in einer While-Schleife dein
COM-Port prüfen ob es Frei ist und danach das Array mit den Befehlen
abarbeiten. Nach jedem abgearbeiten Befehl sortierst du das Array
neu, also "Eins Nachschieben". Somit hast du dann einen Puffer mit
dem du arbeiten kannst ...
Dein Überlaufevent hasst du wenn das Array voll ist.

So oder so ähnlich. :mrgreen:

snow 11. Jan 2008 11:18

Re: Befehle puffern? Langsame verbindungen?
 
Danke das hilft schon mal.

Ich hab jetz eine möglichkeit gefunden die warteschleife automatisch nachrutschen zu lassen.

Da ich strings versenden muss (maximale länge = 2) dachte ich daran die strings in einem Großen string zusammen zuhängen. Dann müsste ich nur einen Operator dazwischen machen, und in einer while schleife den anfang des strings bis zum operator versenden und dann den String und den Operator via delete rausstreichen. Das einzige problem ist, dass ich alle zeichen von Chr(0) bis Chr(255) versenden kann ich also kein zeichen mehr als Operator frei habe.

Allerdings hab ich da auch schon eine Idee. es gibt doch bestimmt einen Stringty, der ASCII und Unicode Zeichen gleichzeitig unterstütz. Dann könnte ich irgend ein Unicode zeichen verwenden, welches in der ASCII-tabelle nicht vorkommt und dann hätte ich kein problem mehr mit dem Operator.

was haltet ihr davon, gibt es strings die beides gleichzeitig verwalten könnten?

Gruß snow

marabu 11. Jan 2008 11:57

Re: Befehle puffern? Langsame verbindungen?
 
Hallo,

ich würde die einzelnen Strings nicht verketten. Ich würde mir einen Ringpuffer definieren:

Delphi-Quellcode:
type
  String2 = string[2];

  TRingBuffer = class
  private
    Buffer: array of String2;
    ReadIndex: Integer;
    WriteIndex: Integer;
    IsFull: Boolean;
  public
    constructor Create(size: Integer);
    destructor Destroy; override;
    procedure Clear;
    function InUse: Integer;
    function ReadString: string;
    function Size: Integer;
    procedure WriteString(s: string);
  end;
Der ShortString-Typ String2 belegt nur drei Byte, ein Trennzeichen wird nicht benötigt, im Puffer muss nichts verschoben werden.

Freundliche Grüße

snow 11. Jan 2008 12:32

Re: Befehle puffern? Langsame verbindungen?
 
Danke dei idee ist gut aber ich bleib bei meiner.

ICh benutz jetz einfach das Unicode zeichen 256.

Da unicode auf den ersten 255 Zeichen ja ASCII kompatibel ist wird einfach der Ganze string in Unicode gewandelt.

Unicode(256) sieht so aus.
Da es in der ASCII tabelle nicht vorkommt macht es also keinen Befehl zu einem Trennzeichen.


Zitat:

Ā
Ich weis, dass meine methode ein paar Bytes mehr braucht aber bei vllt insgesammt 2 Kbyte lohnt sich das erstellen einer neuen Klasse nicht.

Gruß snow

RavenIV 11. Jan 2008 13:46

Re: Befehle puffern? Langsame verbindungen?
 
Zitat:

Zitat von snow
So nun komm ich zu dem problem, dass die geschwindigkeit meins Interfaces(Märklin 6050) gerade einmal 2400bit/s beträgt.

Du weisst schon, dass man bei einer seriellen Schnittstelle (COM1) die Übertragungsrate wählen kann?
Setz doch die Geschwindigkeit auf 2400 bit/s, dann hast vielleicht einige Probleme weniger.

snow 11. Jan 2008 18:45

Re: Befehle puffern? Langsame verbindungen?
 
Zitat:

Du weisst schon, dass man bei einer seriellen Schnittstelle (COM1) die Übertragungsrate wählen kann?
Setz doch die Geschwindigkeit auf 2400 bit/s, dann hast vielleicht einige Probleme weniger.
was meinst du was ich gemahct habe.

es geht nicht darum, dass ich die geschwindigkeit nicht eingestellt habe sondern dass das interface aon 1987 ist und desshalb kein D-Zug ist. Wenn ich zb. nen rückmelder abfrage, dann kann das interface laut handbuch dafür bist zu 300ms in anspruch nehmen. Wenn mein programm aber innerhalb dieser 300ms nen befehl für z.b ne weiche hat, dann kann ich ihn nicht senden, da CTS auf High ist. Desshalb muss ich ne Warteschleife erstellen, wo mein programm reinschreiben kann, und wo befehle dann (wenn das interface bereit ist) durchgefürt werden können.

Ich hab mitlerweise nen TThreat erstellt und müsste nun wissen ob bei einem solchen dienst die priorität niedrig ausreicht, und ob der TThreat-Wizard von Delphi bereits so sachen wie gleichzeitiger zugriff auf Variablen managed?

Edit:// tpIdle reicht bei mir(30.000.000 speicherzugriffe in ca 15 ms)

gruß snow


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:02 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-2025 by Thomas Breitkreuz