AGB  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

RS232 langasm

Ein Thema von tomkupitz · begonnen am 12. Sep 2017 · letzter Beitrag vom 13. Sep 2017
Antwort Antwort
Foren-Tage 2017
DIE Konferenz für Delphi-Entwickler mit vielen Vorträgen und ganztägigen Workshops, veranstaltet u.A. von der Delphi-PRAXiS und Embarcadero.
21.-23. September 2017 in Hamburg · Mehr Infos unter forentage.de.
tomkupitz

Registriert seit: 26. Jan 2011
77 Beiträge
 
Delphi 10 Seattle Professional
 
#1

RS232 langasm

  Alt 12. Sep 2017, 15:15
Hallo,

wir lesen von der seriellen Schnittstelle mit

Code:
ReadFile(ComHandle, buf, SizeOf(buf), BytesRead, nil);
Die Länge mancher Antworten (auf ser. Befehle) ist unbekannt und ein #13 ist auch nicht vorhanden.

Wie kann ich solche Antworten möglichst schnell und vollständig abholen?

Danke und beste Grüße
  Mit Zitat antworten Zitat
Der schöne Günther
Online

Registriert seit: 6. Mär 2013
4.046 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: RS232 langasm

  Alt 12. Sep 2017, 15:59
Die Größe des Buffers auf 1 setzen, jedes einzelne Byte in einen Puffer (z.B. eine Queue) legen bei jedem neuen Byte schauen ob man mit dem bislang erhaltenen Content etwas anfangen kann?
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
Ort: Oberreichenbach
15.821 Beiträge
 
Delphi XE6 Professional
 
#3

AW: RS232 langasm

  Alt 12. Sep 2017, 16:11
Es gibt Komponenten (z.B. AsyncPro) welche die Möglichkeit bieten Evengesteuert auf eingetroffene Daten zu reagieren.
Hatte mit diesen Komponenten im letzten Jahrtausend ganz gute Erfahrungen.
Mittlerweile sind sie OpenSource so das auch keine finanzielle Hürde den Einsatz verhindern würde.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
33.216 Beiträge
 
Delphi XE3 Professional
 
#4

AW: RS232 langasm

  Alt 12. Sep 2017, 17:19
Zitat:
Die Länge mancher Antworten (auf ser. Befehle) ist unbekannt und ein #13 ist auch nicht vorhanden.

Wie kann ich solche Antworten möglichst schnell und vollständig abholen?
Garnicht?

Vollständig geht nur, wenn jemand weiß wie lang es ist.
Sei es eine bekannte/statische Länge, eine Längenangabe im Datenanfang (Längenbyte) oder eine Markierung für das Datenende (z.B. die #13).
Auf eine Sendepause kann man hier ja nicht sonderlich gut reagieren (außer man holt die Daten z.B. via Interrupt umgehen ab), um sie als Ende zu verwenden.



AsyncPro, TComPort usw. laden meistens in einem Thread im Hintergrund und machen dann intern auch nur ReadFile.
Liegt AsyncPro nicht auch im GetIt rum?

Wenn die Länge bekannt ist, dann ist ein direktes ReadFile mit der gewünschten Länge somit das Schnellste.
ReadFile kann auch Asynchron aufgerufen werden (siehe Overlapped) und man bekommt dann z.B. ein Event, wenn alle Daten da sind.

RS232 ist immer gleich schnell und du kannst dir sogar ausrechnen, wie lange es dauert.
Schneller geht es nur mit einer höheren Taktrate.

1 Startbit, 1 Stopbit, 8 Datenbits und keine Parität = 10 Bits pro Byte
Bei 9600 BAUD (in diesem Fall BitsProSekunde) = maximal 960 Byte pro Sekunde



Was heißt eigentlich langsam?

Die Daten werden zu langsam übertragen
oder es kommen nicht "durchgängig" Daten und ReadFile wartet manchmal länger, bis irgendwan Daten empfangen werden. (von irgendwem versendet)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
5.602 Beiträge
 
Delphi 7 Personal
 
#5

AW: RS232 langasm

  Alt 12. Sep 2017, 18:31
Vollständig geht nur, wenn jemand weiß wie lang es ist.
Sei es eine bekannte/statische Länge, eine Längenangabe im Datenanfang (Längenbyte) oder eine Markierung für das Datenende (z.B. die #13).
#13=x0B (VT) ist aber nicht so gebräuchlich
eher x02 (STX) und x03 (ETX)
es könnte ja auch wider Erwarten ein Protokoll genutzt werden:
vgl. https://de.wikipedia.org/wiki/Seriel...3%BCbertragung

Gruß
K-H
Programme gehorchen nicht Deinen Absichten
sondern Deinen Anweisungen
Do it with Delphi Programming
  Mit Zitat antworten Zitat
tomkupitz

Registriert seit: 26. Jan 2011
77 Beiträge
 
Delphi 10 Seattle Professional
 
#6

AW: RS232 langasm

  Alt 12. Sep 2017, 20:08
Hallo,

es geht hier um ein Firmware-Update. "Unser" ReadFile ist gegenüber einem Herstellertool ziemlich langsam. Ich weiß aber nicht was die ganau anders machen.

Danke erstmal an alle. Ich werde Overlapped ausprobieren.

tom
  Mit Zitat antworten Zitat
Der schöne Günther
Online

Registriert seit: 6. Mär 2013
4.046 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: RS232 langasm

  Alt 12. Sep 2017, 21:30
Etwas anderes als ReadFile werden die auch nicht machen. Wenn dein Buffer so groß ist du als nNumberOfBytesToRead nun SizeOf(Buffer) und nicht z.B. 1 angibst dann läufst du zwangsweise auf einen Timeout. Der ist übrigens so lang wie du ihn eingestellt hast (Hast du doch, oder?).

Ansonsten will ich nichts schlechtreden, aber ich glaube Overlapped macht das ganze nur asynchron, auf deinen Timeout läufst du trotzdem. Glauben statt wissen da ich es noch nie gebraucht habe - Einfach Byte für Byte lesen und wenn die Länge nicht bekannt ist kann eh nur dein Code wissen ob die Nachricht komplett ist. Deshalb einfach nach jedem Byte schauen.
  Mit Zitat antworten Zitat
bytecook

Registriert seit: 6. Aug 2010
Ort: Dornbirn
68 Beiträge
 
Delphi 10.1 Berlin Professional
 
#8

AW: RS232 langasm

  Alt 13. Sep 2017, 10:42
Alternativ zu den herkömmlichen Komponenten ist auch TSynaSer mit den Blocking Mechanismen (in einem Thread oder in einem OTLTask verarbeitet) ganz nett.

Dort bietet sich

"function RecvPacket(Timeout: Integer): AnsiString; virtual;" an. (Ggf mit INFINITE als Timeout Value).

Ich lese damit bulkweise die Daten in einen Buffer und überprüfe, ob die eingegangenen Bytes bereits dem zu erwartenden Konstrukt entsprechen.

Mehr Info:

http://synapse.ararat.cz/doc/help/sy...ockSerial.html
http://synapse.ararat.cz/doc/help/synaser.html
http://synapse.ararat.cz/doc/help/
Peter
Ihr müsst jetzt stark sein aber irgendwann müsst ihr es erfahren: Den DHL-Mann gibt es gar nicht.
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
1.036 Beiträge
 
Delphi 10.1 Berlin Professional
 
#9

AW: RS232 langasm

  Alt 13. Sep 2017, 12:58
Ich schreibe mir Alles was ankommt in eine ThreadedQueue, und habe danach genug Zeit das im anderen Thread zu analysieren und ggf. ein OnDataComplete zu feuern.

Aber schneller wird es dadurch wohl auch nicht, das liegt denke ich eher beim RS232 an sich.

Rollo
  Mit Zitat antworten Zitat
Klaus01
Online

Registriert seit: 30. Nov 2005
Ort: München
5.124 Beiträge
 
Delphi XE7 Professional
 
#10

AW: RS232 langasm

  Alt 13. Sep 2017, 13:01
RS232 kann doch bis zu 115000 baud (bits per second)
So langsam ist das nun auch wieder nicht.
Wie ist denn die Schnittstelle bei dir eingestellt?

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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:

Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:56 Uhr.
Powered by vBulletin® Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2017 by Daniel R. Wolf