StromPi 3, nutzen mit .NET Core 3.0 (SerialPort)

1.06K views
0 Comments

Hallo, ich würde den Strompi 3 gerne mit .NET Core steuern, da ich aus verschiedenen Gründen mit C# arbeite und nicht in Python. Leider ist mein Wissen über die serielle Schnittstelle und die Erwartungen des Strompi3 an die serielle Kommunikation nicht ausreichend.
Die Konfiguration und das Öffnen des seriellen Ports (Listing 1) sind vergleichbar umgesetzt wie bei Python. Da der Port geöffnet ohne Exception wird, sollte das erfolgreich sein.
Bei der Umsetzung der „Status-Abfrage“ ist der python-code nicht so 1:1 portierbar und ich habe mit read(), readline() und den sleeps() einiges erfolglos versucht: Das serielle Schreiben von „quit“ und „CR“ und „status-rpi“ und „CR“ mit den 2 Pausen ist vergleichbar umgesetzt, aber es scheint keine Wirkung zu haben, da die serielle Schnittstelle (StromPi3) keine Antwort schickt (Readbuffer ist immer leer).
Da hänge ich nun fest: Die serielle Schnittstelle schein i.O. zu sein, aber was genau erwartet der StromPi3 als Input, um etwas zurück zu senden ? Die fast 1:1-Portierung von Python-Code war nicht erfolgreich. Gibt es weitere Informationen dazu ?
Für Hinweise wäre ich sehr dankbar !
Lg  Helmut

PS: Der Aufruf von „sudo python3 StromPi3_Status.py“ ist erfolgreich, die anschliessend gestartete .Net Core-App „serialConsoleTest.dll“ (mit dem beschriebenem Inhalt der Listings) leider nicht.

Listing 1:
/// <summary>
/// Connect the serial interface of StromPi3
/// </summary>
public void Connect()
{
int baudRate = 38400;
string portName = @“/dev/serial0″;
int dataBits = 8;
StopBits stopBits = StopBits.One;
Parity parity = Parity.None;
int readTimeout = 1500;
int writeTimeout = 1500;
_portParameter = new SerialPortParameter(portName, baudRate, parity, dataBits, stopBits, readTimeout, writeTimeout);
if (_serialPort == null)
{
_serialPort = _portParameter.GetSerialPort();
}
Console.WriteLine($“connected to {_serialPort}“);
if (_serialPort.IsOpen) {_serialPort.Close();}
_serialPort.Open();
Console.WriteLine($“serial port is open „);
}
Listing 2:
private int breakShort = 100;
private int breakLong = 500;
/// imitate StromPi3_Status.py
public void ReadStatus()
{
_serialPort.Write(„quit“);
Thread.Sleep(breakShort);
_serialPort.Write(„\r“);        // \x0d = {13} Carriage Return
Thread.Sleep(breakLong);
_serialPort.Write(„status-rpi“);
Thread.Sleep(1000);
_serialPort.Write(„\r“);
Console.WriteLine(„1. serial read(9999)“);
char[] buffer = new char[9999];
int sp3_time = _serialPort.Read(buffer, 0, 9999);   // imitate serial.readline(9999)
Console.WriteLine($“1. = ({sp3_time})“);
_serialPort.Close();
}

Answered question

6 Answers

Guten Tag Helmut,
da wir das StromPi Projekt als Open-Source-Projekt betreiben ist es natürlich ok für uns. Wir begrüßen es wenn Mitglieder der Community Ihre Arbeit mit anderen teilen wollen.
Mit freundlichen Grüßen
Nils (Joy-IT)

Answered question
Anonymous 0 Comments

Hallo Nils,
ich habe die Pausen mal ganz rausgenommen, und das Lesen des Status funktioniert weiterhin. Das gesamte Projekt hab ich auf Github getan: https://github.com/helmischelmi/net-strompi3. Hoffe, das ist ok für euch ?
Mit freundlichen Grüßen
Helmut

Edited answer

Guten Tag Helmut,
aus Python ist mir keine WriteLine Methode bekannt. Ob die WriteLine Methode in .net Core 3.0 funktioniert müssten Sie mal ausprobieren. Die Pausen sind nur um die Kommunikation zu entzerren. Die Zeit der Pausen ist aber nicht optimiert. Es kann sein, dass es auch mit deutlich kürzeren Pausen funktioniert.

Mit freundlichen Grüßen
Nils (Joy-IT)

Answered question

Hallo Nils,
danke für deine Recherche. Mit dem Einsatz der Readline()-Methode geht es.
Ich habe im folgenden Screenshot die Parameter des SerialPorts (via .Net Core) auf die Console gebracht. Bis zum Auslesen der Uhrzeit des Strompi3 mit ReadLine()..

Eine Frage zum Python-code zwecks besseren Verständnisses habe ich noch:
Wozu sind die waits ? Sind das Reaktionszeiten, die der Strompi3 benötigt?
_serialPort.Write(„quit“);
Thread.Sleep(breakShort);
_serialPort.Write(„\r“); // \x0d = {13} Carriage Return
Thread.Sleep(breakLong);

Warum ginge als Ersatz nicht: _serialPort.Writeln(„quit“); oder ähnliches ?
Danke und freundliche Grüsse
Helmut

Answered question

Guten Tag Helmut,
ich denke, dass wir einen Lösungsansatz gefunden haben. In Ihrem Code verwenden Sie:

int sp3_time = _serialPort.Read(buffer, 0, 9999);   // imitate serial.readline(9999)

Wir denken, dass das Problem nicht in der Konfiguration des Serialports liegt, sondern die Read Methode in diesem Fall nicht die richtige ist, sondern die ReadLine Methode zu dem gewünschten Ergebnis führt.
Mit freundlichen Grüßen
Nils (Joy-IT)

Answered question
Write your answer.