COM_READ begrenzen

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

COM_READ begrenzen

Beitrag von Jan »

Hallo,

ich habe in einem Programm eine Kommunikation mit einer seriellen Schnittstelle eingebaut. und habe da folgendes Problem: Ich lasse in einem Thread ein COM_READ() laufen. Die meiste Zeit steht der nur gelangweilt in der Gegend rum und horcht, ob da irgendwas kommt. Mein Problem: In der Zeit ist jegliche Kommunikation an diesen COM-Port blockiert. Ich muß aber ab und an etwas dahin senden.

Nun gibt es in den Tools die Funktion COM_READMODE(). Mir schien, das die genau das Richtige für mich wäre. Aber leider komme ich damit auch nicht aus dem Dauer-Wartezustand der Schnittstelle raus. Ich habe das hier versucht:

Code: Alles auswählen

   COM_READMODE(nAktCom, READ_TIMEOUT, 0)
   cTicketCode := COM_READ(nAktCom, nCount)
alternativ das hier:

Code: Alles auswählen

   COM_READMODE(nAktCom, WAIT_READ_TIMEOUT, 0)
   cTicketCode := COM_READ(nAktCom, nCount)
Beides ohne Erfolg.

Hat jemand eine Idee, wie ich das hinbekommen könnte?

Zur Info: Der Thread hat einen eingestellten Intervall von 100. Nach einem Lesen würde der also im eingestellten Abstand wieder in den Lese-Zyklus gehen.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: COM_READ begrenzen

Beitrag von Tom »

Mmh. Ich habe zuletzt vor Jahrhunderten etwas mit der COM-Schnittstelle gemacht, aber ich würde einfach COM_CLOSE auslösen, die Schnittstelle neu initialisieren, senden, wieder schließen und in den READ-Modus zurückkehren, fertig.
Herzlich,
Tom
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: COM_READ begrenzen

Beitrag von Jan »

Hallo Tom,

das ist dann natürlich richtig radikal.

Aber sinnlos. Selbst ein com_close() geht nicht, während der im com_rad() wartet ...

Und ja, serielle Schnittstellen sind ein wenig her. Aber hier geht es um das Öffnen von uralten Toren - die können nur com.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: COM_READ begrenzen

Beitrag von Tom »

Hallo, Jan.

Du schreibst, dass Du in einem Thread ein COM_Read laufen lässt. Ich vermute eine DO WHILE-Situation. Die könnte natürlich unterbrochen werden, um zu senden, etwa über globale Variablen oder Get-Set-Funktionen. Da es immer nur um ein und dieselbe Schnittstelle geht, dürfte das auch unproblematisch sein.

Code: Alles auswählen

DO WHILE MeineGuete() // Port offen, weiter warten, was weiß ich.
  x := COM_Read(nPort,1)
  IF Len(x) > 0
    * Verarbeitung
  ENDIF
  Sleep(0)
  IF SendeUnterbrechung()
    * Sende irgendwie, etwa Daten aus einer globalen Variablen
   SendeUnterbrechung(.F.)
 ENDIF
ENDDO
Oder so ähnlich.
Herzlich,
Tom
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1418
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Re: COM_READ begrenzen

Beitrag von Rudolf »

Hallo,
wieso liest Du nicht in der Schleife einfach den Buffer ohne Löschen aus um zu sehen ob was da ist ? Besser wäre wenn über RTS/CTS (RS485) geregelt wird wann wer schreibt und liest.
Grüße
Rudolf
Benutzeravatar
HaPe
1000 working lines a day
1000 working lines a day
Beiträge: 995
Registriert: So, 15. Nov 2015 17:44
Wohnort: 71665 Vaihingen-Enz
Hat sich bedankt: 17 Mal
Danksagung erhalten: 15 Mal

Re: COM_READ begrenzen

Beitrag von HaPe »

Hallo Jan !

Ich möchte nochmal auf meine Äußerungen in viewtopic.php?f=32&t=9802 hinweisen.
Nimm was Gescheites und du wärst schon lange fertig. :blob8:
Ich hatte Messgeräte lange mit dem MSCOM-Control bedient und ausgelesen.
Deine Probleme hatte ich damit nie ...
--
Hans-Peter
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1418
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Re: COM_READ begrenzen

Beitrag von Rudolf »

Hallo,
geht auch mit den Funktionen der Tools, habe die Zutritts und Zeiterfassungsterminals der Handelskette und vieler Banken damit gelesen und beschrieben, war absolut problemlos in Clipper und dann mit Xbase++. War RS485 Kommunikation, geht aber auch ohne.
Grüße
Rudolf
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: COM_READ begrenzen

Beitrag von ramses »

Da muss ich Rudolf zustimmen. Geht einach mit den Tools. Gib nicht auf.
Mit RS485 geht es einfach über längere Distanzen und Master-Slave Betrieb ist möglich. Auf RTS/CTS und Konsorten kannst du leicht verzichten. Wobei einige Pegelwandler die an die RS232 des PC's gesteckt werden diese "Steuerpins" als Spannungsversorgung nutzen und ein definierter Zustand zur Funktion nötig ist.

Gruss Carlo
Valar Morghulis

Gruss Carlo
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: COM_READ begrenzen

Beitrag von brandelh »

Ich denke es liegt am AUTOSTART deines Threads, der beißt sich mit dem Timeout der Hardware !
Ich baue solche Sachen immer in eine abbrechbare Endlosschleife und lass es laufen !
Zum Debuggen einfach eine Funktion ohne threads nutzen,

Code: Alles auswählen

do while ...
     if endebedingung
        exit
     endif
     Lese Zeichen von comport 0.01 Sekunden /// das sollte ein Ersatz für Sleep(1) sein, den ich normal zum warten nutze
     mach was mit deinen Zeichen
enddo
Wenn die Funktion macht was sie soll, dann lass sie endlos laufen oder Starte / Beende nach Bedingung.
Der Autostart eines Threads, der auf einen laufenden trifft (was da vor geht weiß ich jetzt gar nicht), muss sich selbst im Wege stehen.
Beide balgen sich um die eine COM Schnittstelle, das kann nicht gut gehen.
Gruß
Hubert
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2932
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 13 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Re: COM_READ begrenzen

Beitrag von Wolfgang Ciriack »

Ich würde evtl. erst einmal mit Com_Count() prüfen, ob überhaupt etwas mit Com_Read() zu lesen ist.
Viele Grüße
Wolfgang
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: COM_READ begrenzen

Beitrag von Jan »

Erstmal Danke all den vielen Gedanken, Ideen, und Vorschlägen.

Aus irgend einem Grund läuft das jetzt gerade. Ich weiß im Moment noch nicht warum, aber das bekomme ich auch noch raus ...

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Antworten