Forum: PC-Programmierung c#: Prinzipfrage Daten seriell auslesen


von PK543 (Gast)


Angehängte Dateien:

Lesenswert?

Hi,
ich habe eine Prinzipfrage wie ich Geräteparameter am besten auslesen 
kann.
Vorhanden ist eine Com-Hardware die ich regelmäßig (per Timer - geht 
leider treiberbedingt nicht anderst) anpolle ob neue Daten empfangen 
wurden.

nun möchte Daten aus der dort angeschlossenen Hardware auslesen. Hierbei 
will ich gerne eine methode erstellen welche die auszulesenden Werte als 
Rückgabewert zur Verfügung stellt.
in etwa so:
1
private UInt32 ReadDeviceParameter(Uint16 ParmeterAdress);

Mein Problem ist dass ich nicht weiß, wie ich einen Rückgabewert 
erstellen soll wenn die empfangenen Daten in einem anderen Prozess 
empfangen werden.

Anbei mal ein Bild wie ich das gerne machen würde, eine "while (neue 
Daten==true) geht nicht, den aufgrund der while-schleife würde der timer 
ja gar nicht mehr aufgerufen werden.
Einen eigenen thread für den timer will ich auch nicht, denn dann wäre 
die GUI eingefroren solange ich auf eine Antwort warte.


Das senden und das empfangen von Daten geschieht in unterschiedlichen 
methoden, soll dann aber in der selben methode zusammen laufen - geht 
das überhaupt? Wie würdet Ihr soetwas lösen?

von Peter II (Gast)


Lesenswert?

PK543 schrieb:
> Vorhanden ist eine Com-Hardware die ich regelmäßig (per Timer - geht
> leider treiberbedingt nicht anderst) anpolle ob neue Daten empfangen
> wurden.

warum? ein Timer macht hier gar keinen sinn.

Ich würde einfach einen ExtraThread machen der für das lesen und 
schreiben zuständig ist. Dieser liest und schreibt denn blockierend auf 
der Schnittstelle.

die methode
ReadDeviceParameter(Uint16 ParmeterAdress);

kann doch einfach Read uns Write der schnittstelle aufrufen, verstehe 
das Probelm nicht.

(Du musst nicht die Event der schnittstelle verwenden, das macht der 
ganze erst kompiziert)

von PK543 (Gast)


Lesenswert?

mein Problem ist die Schnittstelle. Es handelt sich um eine spezielle 
PC-Karte mit eigenem Treiber - hier kann ich nichts dran ändern.

Der Timer pollt alle 30ms die PC-Karte an und stellt dann empfangene 
Datenpakete zur verfügung - hier kein ich nichts in einen extra thread 
laufen lassen.

Ich könnte höchstens den timer_tick-Aufruf in einen eigenen thread 
verpacken - aber dann wird es ja noch tiefer verschachtelt!?

von Peter II (Gast)


Lesenswert?

PK543 schrieb:
> Der Timer pollt alle 30ms die PC-Karte an und stellt dann empfangene
> Datenpakete zur verfügung - hier kein ich nichts in einen extra thread
> laufen lassen.

versteht ich nicht, in welcher Form kommen denn die Daten an? Zeig mal 
etwas code.

von PK543 (Gast)


Lesenswert?

mein Treiber stellt 3 Methoden bereit:
1
struct sPK543
2
{
3
   bool NewData;
4
   UInt32 Data;
5
}
6
7
PK543Init(UInt16 Baud);  //initialising Hardware (incl. 30ms Rx-Timer)
8
PK543tx(UInt16 Adress, UInt32 Data); //send your Data to Device
9
PK543timer-tick(object sender, EventArgs e); //30ms if new Data avalible, read sPK543
10
11
PK543timer-tick(object sender, EventArgs e)
12
{
13
   // class PK543 will filled by driver, no need to be public...
14
   sPK543 RxData = new sPK543;
15
   if (PK543.RxData==true)
16
   {
17
      rxData = PK543.PK543receive;
18
   }
19
}

Das ist leider alles. ich kann nun im Timer die RxData verwenden wie ich 
möchte. Das ganze ist ziemlich doof gelöst, dachte jetzt daran dass ich 
aus dem timer heraus einen event auslöse mit welchem ich die Daten im 
meinen Programmcode hinen bringe, weiß aber nicht ob das optimal ist. 
Der Hersteller selbst empfielt im Handbus die Daten per public sPK543 zu 
verwenden.
1
struct sPK543
2
{
3
   bool NewData;
4
   UInt32 Data;
5
}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.