Forum: PC-Programmierung Seriellen Stream auslesen mit C#


von Thomas (Gast)


Lesenswert?

Hallo zusammen,

ich stehe gerade total auf dem schlauch und bräuchte mal den einen oder 
anderen Denkanstoß.
Ich habe ein µC der mir einen Datenstrom über die serielle Schnittstelle 
zur Verfügung stellt (unidirektional), ein Packet sind immer 10Byte.
dieser Wird in einem visual Studio C# Programm ausgelesen:
1. ich öffne den Port:
1
// open COM port
2
SerialPort port = new SerialPort("COM5", 9600, Parity.None, 8, StopBits.One);
3
port.Open();
2. ich habe einen bufferArray mit der Länge 10 erstellt und lese den 
Port aus
1
static byte[] buffer = {0, 0, 0, 0 ,0 ,0 ,0 ,0 ,0 ,0 };
2
// Read first byte "0x00"
3
buffer[0] = Convert.ToByte(port.ReadByte());
4
// Start Byte des Pakets ist 0x00
5
if (buffer[0] == 0) 
6
{
7
   ...
8
   for (int i = 1; i < 11; i++)
9
   {    
10
      buffer[i] = Convert.ToByte(port.ReadByte());  // read byte i (1-10, 0 wurde schon gelesen) 
11
      ...
12
   }
13
}

Nun zu meinen Fragen:
1. da ich ja nur ein Polling Verfahren nutze merkt mein C# Programm 
nicht wenn der Stream mal Stoppt, wie könnte ich dieses einfügen?
2. ich würde diesen Programmteil gern als neuen Task auslagern der im 
Hintergrund läuft, Wie kann ich den Inhalt des Buffers am Besten 
übergeben bzw bereitstellen(an ein anderes Programm oder Task).
3. Würdet ihr genauso vorgehen oder sollte man das Problem 
anders/eleganter wie auch immer lösen

von Thomas (Gast)


Lesenswert?

Es wäre schön wenn mir hier jemand Tipps und Tricks verraten könnte,
vielen Dank schon einmal im voraus.

BG Thomas

von Peter II (Gast)


Lesenswert?

Thomas schrieb:
> Nun zu meinen Fragen:
> 1. da ich ja nur ein Polling Verfahren nutze merkt mein C# Programm
> nicht wenn der Stream mal Stoppt, wie könnte ich dieses einfügen?
es gibt keine Stop bei einem Stream - was meinst du damit?

Das ganze ist auch kein Polling, weil Read blockiert. Wenn du den 
Timeout richtig setzt, kommt eine exception wenn lange nichts empfangen 
wurde.


> 2. ich würde diesen Programmteil gern als neuen Task auslagern der im
> Hintergrund läuft, Wie kann ich den Inhalt des Buffers am Besten
> übergeben bzw bereitstellen(an ein anderes Programm oder Task).
einen einen Thread starten und das objekt in der Klasse als member 
anlegen


> 3. Würdet ihr genauso vorgehen oder sollte man das Problem
> anders/eleganter wie auch immer lösen
ja, sehen keinen groben Konzeptfehler. Man kann es auch über einen Event 
lösen, aber davon bin ich auch kein Freund.

von Thomas (Gast)


Lesenswert?

hi Peter,

danke für deine Hinweiße, das baut mich ja sogar etwas auf (hab keine 
Fehler gemacht). Werde gleich mal die Sache mit dem Timer ausprobieren.

wenn ich die Funktion als Thread starte könnte ich ja noch eine Variable 
"activ" als Bool erstellen und das ganze dann nochmal in eine if else 
schleife verpacken um das lesen zu Aktivieren.
1
if (active==true)
2
{
3
   // lese Stream
4
   ...
5
}
6
// else tue nichts

gibt es noch eine Möglichkeit die Daten für andere Programme/Klassen 
bereitzustellen? Ich wollte die Programmteile Auslesen des Daten Streams 
und Verarbeitung strickt trennen da ich für die Verarbeitung 
verschiedene Programme entwerfen wollte und je nach Anwendung nur ein 
Programm ausführen wollte.

Vielen Dank und BG Thomas

von Peter II (Gast)


Lesenswert?

Thomas schrieb:
> wenn ich die Funktion als Thread starte könnte ich ja noch eine Variable
> "activ" als Bool erstellen und das ganze dann nochmal in eine if else
> schleife verpacken um das lesen zu Aktivieren.

kann man machen, das Problem ist aber das beim else die CPU auf 100% 
geht weil er nie wartet. Da solltest man zumindest ein sleep mit 100ms 
einbauen. (Wenn man es richtig schön machen will, ein EVENT anlegen)

> Ich wollte die Programmteile Auslesen des Daten Streams
> und Verarbeitung strickt trennen da ich für die Verarbeitung
> verschiedene Programme entwerfen wollte und je nach Anwendung nur ein
> Programm ausführen wollte.
kann man machen wenn man viel Zeit hat. Dafür musst du dich dann aber 
noch mit Interprozesskommunikation beschäftigen, das ganze wird dann 
wesentlich komplexer.

Warum die verschieden Auswertungen nicht als PlugIn in das Programm 
einbinden, bei C# geht das recht einfach.

von serial stream (Gast)


Lesenswert?


von Thomas (Gast)


Lesenswert?

Hi serial stream (Gast),

das trifft mein Problem relativ gut. Ich versuch mal den Code aus dem 
Beispiel auf meinen System umzusetzen.

Danke Thomas

von serial stream (Gast)


Lesenswert?

Hallo!

Hier noch was zum Datenaustausch zwischen Programmen:
https://msdn.microsoft.com/en-us/windows/uwp/app-to-app/index

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.