COM_EVENT - wer hat schon damit gearbeitet? [Erledigt]
Moderator: Moderatoren
- Hans Zethofer
- Rekursionen-Architekt
- Beiträge: 278
- Registriert: Fr, 27. Jan 2006 8:29
- Wohnort: 2700 Wiener Neustadt
- Hat sich bedankt: 1 Mal
- Kontaktdaten:
COM_EVENT - wer hat schon damit gearbeitet? [Erledigt]
Hallo!
Was ich benötige ist folgendes:
Ich muß bis zu 8 ComPorts gleichzeitig überwachen. An diesen ComPorts hängt jeweils eine Hardware (Buzzer = Schaltkontakt und eine Elektronic) die beim Drücken dieses Tasters NUR den CTS Status am jeweiligen ComPort auslöst/verändert. (aber keine seriellen Daten verschickt - im Buffer ablegt!)
Jetzt soll dieses CTS Signal im Programm folgendes auslösen:
- alle anderen Ports werden gesperrt und das Signal wird weiterverarbeitet
Danach sollen alle Schnittstellen vom User wieder freigegeben werden für einen nächsten Ablauf.
wobei dieser Teil nicht mein Problem ist - das bekomme ich hin.
Mein Problem ist die CTS-Abfrage für bis zu 8 Ports "gleichzeitig":
Ich habe das bisher mit 8 COM_Event(nComPort) ohne Thread (in einer Schleife) versucht - das hat aber lt. Debugger zur Folge das er an der 1.Schnittstelle solange wartet bis der jeweilige Port das CTS-Signal erkennt und dann erst weitermacht (zur nächsten COM_EVENT Abfrage wechselt).
Dh. beim ersten definierten ComPort wird das CTS-Signal abgefragt - bei allen anderen ComPorts nicht.
Ist für so eine Aufgabe die COM_EVENT-Funktion die richtige?
Kann man damit gleichzeitig mehrere Com-Ports abfragen?
Entweder verstehe ich da was komplett falsch oder ich lausche mit den falschen Funktionen an einer falschen Stelle im Programmcode.
Könntet ihr mir da etwas weiterhelfen wie das am besten ablaufen könnte und welche Programm-Logic Ihr verwenden würdet.
Ich denke das vielleicht eine Threadlösung einfacher ist oder innerhalb einer Schleife nur das COM_CTS() der jeweiligen Ports abfragen
Danke vorab für Antworten
Was ich benötige ist folgendes:
Ich muß bis zu 8 ComPorts gleichzeitig überwachen. An diesen ComPorts hängt jeweils eine Hardware (Buzzer = Schaltkontakt und eine Elektronic) die beim Drücken dieses Tasters NUR den CTS Status am jeweiligen ComPort auslöst/verändert. (aber keine seriellen Daten verschickt - im Buffer ablegt!)
Jetzt soll dieses CTS Signal im Programm folgendes auslösen:
- alle anderen Ports werden gesperrt und das Signal wird weiterverarbeitet
Danach sollen alle Schnittstellen vom User wieder freigegeben werden für einen nächsten Ablauf.
wobei dieser Teil nicht mein Problem ist - das bekomme ich hin.
Mein Problem ist die CTS-Abfrage für bis zu 8 Ports "gleichzeitig":
Ich habe das bisher mit 8 COM_Event(nComPort) ohne Thread (in einer Schleife) versucht - das hat aber lt. Debugger zur Folge das er an der 1.Schnittstelle solange wartet bis der jeweilige Port das CTS-Signal erkennt und dann erst weitermacht (zur nächsten COM_EVENT Abfrage wechselt).
Dh. beim ersten definierten ComPort wird das CTS-Signal abgefragt - bei allen anderen ComPorts nicht.
Ist für so eine Aufgabe die COM_EVENT-Funktion die richtige?
Kann man damit gleichzeitig mehrere Com-Ports abfragen?
Entweder verstehe ich da was komplett falsch oder ich lausche mit den falschen Funktionen an einer falschen Stelle im Programmcode.
Könntet ihr mir da etwas weiterhelfen wie das am besten ablaufen könnte und welche Programm-Logic Ihr verwenden würdet.
Ich denke das vielleicht eine Threadlösung einfacher ist oder innerhalb einer Schleife nur das COM_CTS() der jeweiligen Ports abfragen
Danke vorab für Antworten
Zuletzt geändert von Hans Zethofer am Sa, 30. Mai 2015 22:26, insgesamt 1-mal geändert.
_____________
lg
Hans
lg
Hans
- azzo
- Rekursionen-Architekt
- Beiträge: 483
- Registriert: So, 28. Mär 2010 19:21
- Danksagung erhalten: 11 Mal
Re: COM_EVENT - wer hat schon damit gearbeitet?
Hallo Hans,
kannst du C-Funktionen einbinden.
Um die Com-Schnittstelle abzufragen, verwende ich in Fivewin/Harbour diese Funktionen:
http://www.mikrocontroller.net/attachme ... mTools.cpp
mfg
Otto
kannst du C-Funktionen einbinden.
Um die Com-Schnittstelle abzufragen, verwende ich in Fivewin/Harbour diese Funktionen:
http://www.mikrocontroller.net/attachme ... mTools.cpp
mfg
Otto
- Hans Zethofer
- Rekursionen-Architekt
- Beiträge: 278
- Registriert: Fr, 27. Jan 2006 8:29
- Wohnort: 2700 Wiener Neustadt
- Hat sich bedankt: 1 Mal
- Kontaktdaten:
Re: COM_EVENT - wer hat schon damit gearbeitet?
Hi!
reine COM-Funktionen habe ich in den xBase Tools - da brauche ich eigentlich nichts externes einbinden -
mir ging es um die COM-Event Funktion aus den Tools.
Es gibt anscheinend weder bei Alaska noch bei express++ ein Beispiel mit dieser Funktion - jetzt suche ich halt
jemanden der sich damit vielleicht schon beschäftigt hat bzw. diese im Einsatz hat.
Ich bin schon auf einem möglichen Lösungsweg mit der COM_CTS() Funktion innerhalb einer Abfrage-Schleife
muß das aber noch genauer überprüfen.
Aber vielleicht gibt es ja auch einen anderen (eleganteren) Lösungsansatz
reine COM-Funktionen habe ich in den xBase Tools - da brauche ich eigentlich nichts externes einbinden -
mir ging es um die COM-Event Funktion aus den Tools.
Es gibt anscheinend weder bei Alaska noch bei express++ ein Beispiel mit dieser Funktion - jetzt suche ich halt
jemanden der sich damit vielleicht schon beschäftigt hat bzw. diese im Einsatz hat.
Ich bin schon auf einem möglichen Lösungsweg mit der COM_CTS() Funktion innerhalb einer Abfrage-Schleife
muß das aber noch genauer überprüfen.
Aber vielleicht gibt es ja auch einen anderen (eleganteren) Lösungsansatz
_____________
lg
Hans
lg
Hans
- brandelh
- Foren-Moderator
- Beiträge: 15696
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: COM_EVENT - wer hat schon damit gearbeitet?
hast du das Beispiel eines filetranfers mit threads gesehen ?
D:\alaska\ALASKA.190\XBTW32\SOURCE\SAMPLES\XBTOOLS\COMLINK
nach der Beschreibung von Com_Event() wartet die Funktion solange bis etwas an der com ankommt.
Das Beispiel kommt ohne dieses aus ...
das sind die Rückgabewerte, wobei 0 = Fehler bedeutet ... sorry ich habe damit nicht gearbeitet.
D:\alaska\ALASKA.190\XBTW32\SOURCE\SAMPLES\XBTOOLS\COMLINK
nach der Beschreibung von Com_Event() wartet die Funktion solange bis etwas an der com ankommt.
Das Beispiel kommt ohne dieses aus ...
Code: Alles auswählen
/*
* Definitions for COM_EVENT()
*/
#define COM_EVENT_CHAR 1 // Character arrived at COM port
#define COM_EVENT_CTSDSR 2 // CTS or DSR changed
#define COM_EVENT_ERROR 3 // Line status error occurred (overrun, parity or break)
#define COM_EVENT_RING 4 // Ring indicator detected
Gruß
Hubert
Hubert
- Hans Zethofer
- Rekursionen-Architekt
- Beiträge: 278
- Registriert: Fr, 27. Jan 2006 8:29
- Wohnort: 2700 Wiener Neustadt
- Hat sich bedankt: 1 Mal
- Kontaktdaten:
Re: COM_EVENT - wer hat schon damit gearbeitet?
Eben, sie wartet bis was ankommt - dadurch ist die Funktion für nur "eine Schnittstellenportabfrage" genau richtig
aber in meinem Fall wo ich max. 8 gleichzeitig abfragen muß unbrauchbar!
Werde wohl dann eine andere Lösung suchen - ist so für mich - wie ich es derzeit habe - in einem "einzel Thread" nicht zu gebrauchen
Vielleicht aber in mehreren Threads parallel wobei jeder Thread an einen anderen COM lauscht (es gibt das MODEM.PRG aus den Tools)
das arbeitet auf Thread-Basis und verwendet COM_CTS() was für mich reichen würde. Davon habe ich 2 Dialoge aufgebaut
und damit habe ich schon einmal den gewünschten Erfolg erzielt.
aber in meinem Fall wo ich max. 8 gleichzeitig abfragen muß unbrauchbar!
Werde wohl dann eine andere Lösung suchen - ist so für mich - wie ich es derzeit habe - in einem "einzel Thread" nicht zu gebrauchen
Vielleicht aber in mehreren Threads parallel wobei jeder Thread an einen anderen COM lauscht (es gibt das MODEM.PRG aus den Tools)
das arbeitet auf Thread-Basis und verwendet COM_CTS() was für mich reichen würde. Davon habe ich 2 Dialoge aufgebaut
und damit habe ich schon einmal den gewünschten Erfolg erzielt.
_____________
lg
Hans
lg
Hans
- brandelh
- Foren-Moderator
- Beiträge: 15696
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: COM_EVENT - wer hat schon damit gearbeitet? [Erledigt]
je schnittstelle ein thread, so würde ich das machen. Welche funktion am besten passt kann ich nicht beurteilen.
Gruß
Hubert
Hubert
- Wolfgang Ciriack
- Der Entwickler von "Deep Thought"
- Beiträge: 2935
- Registriert: Sa, 24. Sep 2005 9:37
- Wohnort: Berlin
- Hat sich bedankt: 13 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: COM_EVENT - wer hat schon damit gearbeitet? [Erledigt]
Bei mehreren Threads musst du dann aber - nach Aufgabenstellung - die anderen Threads unterbrechen, wenn einer was empfängt, nach der Verarbeitung diese weiterlaufen lassen.
Viele Grüße
Wolfgang
Wolfgang
- brandelh
- Foren-Moderator
- Beiträge: 15696
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: COM_EVENT - wer hat schon damit gearbeitet? [Erledigt]
wieso, sind die comms nicht threadsave getrennt ?
Gruß
Hubert
Hubert
- Hans Zethofer
- Rekursionen-Architekt
- Beiträge: 278
- Registriert: Fr, 27. Jan 2006 8:29
- Wohnort: 2700 Wiener Neustadt
- Hat sich bedankt: 1 Mal
- Kontaktdaten:
Re: COM_EVENT - wer hat schon damit gearbeitet? [Erledigt]
unabhängig ob threadsaved oder nicht - für meine Zwecke/Anwendung müßten natürlich die restlichen COM's gesperrt / gestoppt werden,
denn - nur einer kann pro Runde gewinnen =D>
denn - nur einer kann pro Runde gewinnen =D>
_____________
lg
Hans
lg
Hans
- brandelh
- Foren-Moderator
- Beiträge: 15696
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: COM_EVENT - wer hat schon damit gearbeitet? [Erledigt]
das kommt natürlich auf die Aufgabe an
Gruß
Hubert
Hubert
- Rudolf
- Programmier-Gott
- Beiträge: 1418
- Registriert: Mo, 02. Jan 2006 23:03
- Wohnort: Salzburg/Österreich
- Kontaktdaten:
Re: COM_EVENT - wer hat schon damit gearbeitet? [Erledigt]
Hallo,
an den Schnittstellen sollte es aber nicht liegen, die können unabhängig voneinander den Event registrieren und durch com_event geprüft werden. Einfach die 8 Threads starten und über eine Schleife und com_event() prüfen. Da muss man keinen Thread deshalb anhalten. Ich würde die Events in eine Queue schreiben und diese abarbeiten.
Grüße
Rudolf
an den Schnittstellen sollte es aber nicht liegen, die können unabhängig voneinander den Event registrieren und durch com_event geprüft werden. Einfach die 8 Threads starten und über eine Schleife und com_event() prüfen. Da muss man keinen Thread deshalb anhalten. Ich würde die Events in eine Queue schreiben und diese abarbeiten.
Grüße
Rudolf
Rudolf Reinthaler
http://www.formcommander.net
http://www.formcommander.net
-
- 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_EVENT - wer hat schon damit gearbeitet? [Erledigt]
Hallo
ich würde auf die RS-232 Funktionen von Xbase verzichten, ich hatte damit schon öfters grosse grosse Probleme.
Etwas zusatz Hardware verwenden welche dir die nötigen die I/O Anschlüsse zur verfügung stellt und diese dann per ModBus seriell oder besser mit TCP/IP abfragen/setzten.
Cu Carlo
ich würde auf die RS-232 Funktionen von Xbase verzichten, ich hatte damit schon öfters grosse grosse Probleme.
Etwas zusatz Hardware verwenden welche dir die nötigen die I/O Anschlüsse zur verfügung stellt und diese dann per ModBus seriell oder besser mit TCP/IP abfragen/setzten.
Cu Carlo
Valar Morghulis
Gruss Carlo
Gruss Carlo