AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Befehle puffern? Langsame verbindungen?

Ein Thema von snow · begonnen am 10. Jan 2008 · letzter Beitrag vom 11. Jan 2008
Antwort Antwort
snow

Registriert seit: 28. Jun 2007
277 Beiträge
 
#1

Befehle puffern? Langsame verbindungen?

  Alt 10. Jan 2008, 22:06
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).
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#2

Re: Befehle puffern? Langsame verbindungen?

  Alt 11. Jan 2008, 07:18
* 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.
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
snow

Registriert seit: 28. Jun 2007
277 Beiträge
 
#3

Re: Befehle puffern? Langsame verbindungen?

  Alt 11. Jan 2008, 11:18
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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: Befehle puffern? Langsame verbindungen?

  Alt 11. Jan 2008, 11:57
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
  Mit Zitat antworten Zitat
snow

Registriert seit: 28. Jun 2007
277 Beiträge
 
#5

Re: Befehle puffern? Langsame verbindungen?

  Alt 11. Jan 2008, 12:32
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
  Mit Zitat antworten Zitat
Benutzerbild von RavenIV
RavenIV

Registriert seit: 12. Jan 2005
Ort: Waldshut-Tiengen
2.875 Beiträge
 
Delphi 2007 Enterprise
 
#6

Re: Befehle puffern? Langsame verbindungen?

  Alt 11. Jan 2008, 13:46
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.
Klaus E.
Linux - das längste Text-Adventure aller Zeiten...
Wer nie Linux mit dem vi konfiguriert hat, der hat am Leben vorbei geklickt.
  Mit Zitat antworten Zitat
snow

Registriert seit: 28. Jun 2007
277 Beiträge
 
#7

Re: Befehle puffern? Langsame verbindungen?

  Alt 11. Jan 2008, 18:45
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:06 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz