![]() |
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). |
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: |
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 |
Re: Befehle puffern? Langsame verbindungen?
Hallo,
ich würde die einzelnen Strings nicht verketten. Ich würde mir einen Ringpuffer definieren:
Delphi-Quellcode:
Der ShortString-Typ String2 belegt nur drei Byte, ein Trennzeichen wird nicht benötigt, im Puffer muss nichts verschoben werden.
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; Freundliche Grüße |
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:
Gruß snow |
Re: Befehle puffern? Langsame verbindungen?
Zitat:
Setz doch die Geschwindigkeit auf 2400 bit/s, dann hast vielleicht einige Probleme weniger. |
Re: Befehle puffern? Langsame verbindungen?
Zitat:
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