COM_EVENT - wer hat schon damit gearbeitet? [Erledigt]

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

Moderator: Moderatoren

Antworten
Benutzeravatar
Hans Zethofer
Rekursionen-Architekt
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]

Beitrag von Hans Zethofer »

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
Zuletzt geändert von Hans Zethofer am Sa, 30. Mai 2015 22:26, insgesamt 1-mal geändert.
_____________
lg
Hans
Benutzeravatar
azzo
Rekursionen-Architekt
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?

Beitrag von azzo »

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
Benutzeravatar
Hans Zethofer
Rekursionen-Architekt
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?

Beitrag von Hans Zethofer »

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
_____________
lg
Hans
Benutzeravatar
brandelh
Foren-Moderator
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?

Beitrag von brandelh »

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 ...

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
das sind die Rückgabewerte, wobei 0 = Fehler bedeutet ... sorry ich habe damit nicht gearbeitet.
Gruß
Hubert
Benutzeravatar
Hans Zethofer
Rekursionen-Architekt
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?

Beitrag von Hans Zethofer »

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.
_____________
lg
Hans
Benutzeravatar
brandelh
Foren-Moderator
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]

Beitrag von brandelh »

je schnittstelle ein thread, so würde ich das machen. Welche funktion am besten passt kann ich nicht beurteilen.
Gruß
Hubert
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
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]

Beitrag von Wolfgang Ciriack »

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
Benutzeravatar
brandelh
Foren-Moderator
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]

Beitrag von brandelh »

wieso, sind die comms nicht threadsave getrennt ?
Gruß
Hubert
Benutzeravatar
Hans Zethofer
Rekursionen-Architekt
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]

Beitrag von Hans Zethofer »

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>
_____________
lg
Hans
Benutzeravatar
brandelh
Foren-Moderator
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]

Beitrag von brandelh »

das kommt natürlich auf die Aufgabe an ;-)
Gruß
Hubert
Benutzeravatar
Rudolf
Programmier-Gott
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]

Beitrag von Rudolf »

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
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_EVENT - wer hat schon damit gearbeitet? [Erledigt]

Beitrag von ramses »

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
Valar Morghulis

Gruss Carlo
Antworten