Posts mit dem Label Fehlersuche werden angezeigt. Alle Posts anzeigen
Posts mit dem Label Fehlersuche werden angezeigt. Alle Posts anzeigen

Samstag, 27. Dezember 2025

PWM-Signal auf dem Raspberry PI PINs läst sich nicht ansteuern

Beim Prüfen der PWM-Ausgänge musste ich feststellen, dass sich die Pins nicht ansprechen ließen.

Hierfür habe ich ein C#-Projekt mit .NET erstellt, das auf die GPIOs zugreift und ein PWM-Signal zur Steuerung von zwei Servos einrichtet.
Selbst mit direkten Shell-Kommandos ließen sich die PWM Pins auf dem Raspberry Pi nicht einstellen.


Verwendete Hardware

  • Raspberry Pi 4
  • Raspbian OS
  • Mini-Servo

Ziel

Einen GPIO-Pin für PWM-Signale korrekt einrichten, sodass ein Servo zuverlässig gesteuert werden kann.

  • GPIO12 auf PWM festlegen
  • GPIO13 auf PWM festlegen


Welche Version von Raspbian OS ist installiert?

Mit folgendem Befehl werden mehrere Zeilen ausgegeben, die Informationen über die aktuell verwendete Linux-Version liefern:

 hostnamectl  




PWM zunächst einrichten

Über die config.txt kann der PWM-Eintrag gesetzt werden.
In älteren Raspbian-Versionen befand sich diese Datei unter /boot/config, der Pfad hat sich jedoch geändert zu:

 /boot/firmware/config.txt  

Bearbeiten der Datei:

 sudo nano /boot/firmware/config.txt  

Ganz nach unten scrollen und folgenden Eintrag setzen:

 dtoverlay=pwm-2chan  

HINWEIS: Dieser Eintrag ist Teil des Problems. Die korrekte Lösung wird im letzten Abschnitt unter „Dauerhaft einstellen“ beschrieben.

Speichern mit STRG + O, bestätigen mit ENTER.
Nano mit STRG + X verlassen.

Anschließend muss das Betriebssystem neu gestartet werden:

 sudo reboot  

Servo anschließen

Der Servo kann nun am Raspberry Pi angeschlossen werden.
Die Stromversorgung sollte jedoch nicht über die GPIO-Pins des Raspberry Pi erfolgen. Eine Ausnahme gilt nur für Mini-Servos ohne nennenswerte Last und mit sehr geringem Stromverbrauch.

Zwar kann die USB-C-Stromversorgung bis zu 3 A liefern, dennoch empfiehlt es sich, unter 500 mA zu bleiben und die Stromaufnahme nicht auszureizen.


Einrichtung über die Shell

Zunächst ein einfacher Test, um einen Servo direkt über die Shell anzusteuern.

Prüfen, ob der PWM-Chip verfügbar ist

 ls /sys/class/pwm  

Das erwartete Ergebnis ist pwmchip0.
Andernfalls muss der Chip über die config.txt korrekt eingerichtet werden.




Prüfen, ob pwm0 vorhanden ist

 ls /sys/class/pwm/pwmchip0  

In meinem Fall wurde nur pwm1 angezeigt.




PWM-Kanal exportieren

 echo 0 | sudo tee /sys/class/pwm/pwmchip0/export  

Danach sollte auch pwm0 verfügbar sein.




PWM für Servo einstellen

Periode: 20 ms

 echo 20000000 | sudo tee /sys/class/pwm/pwmchip0/pwm0/period  

Pulsweite für Mittelstellung (1,5 ms)

 echo 1500000 | sudo tee /sys/class/pwm/pwmchip0/pwm0/duty_cycle  

PWM aktivieren

 echo 1 | sudo tee /sys/class/pwm/pwmchip0/pwm0/enable  

An dieser Stelle sollte der Servo in die Mittelstellung fahren.

Servo nach links bewegen (Pulsweite 1 ms)

 echo 1000000 | sudo tee /sys/class/pwm/pwmchip0/pwm0/duty_cycle  

Servo bewegt sich weiterhin nicht

Wenn sich der Servo trotz dieser Einstellungen nicht bewegt, liegt die Ursache sehr wahrscheinlich an der Pin-Konfiguration.
Als Nächstes wird der Status des GPIO-Pins geprüft:

 raspi-gpio get 12  

In meinem Fall erschien die Meldung „command not found“.




Alternative Prüfung

 pinctrl get 12  

Damit lässt sich ebenfalls die aktuelle Konfiguration von GPIO12 auslesen.
In meinem Fall ergab sich folgendes Ergebnis:



raspi-gpio-Paket installieren?

In aktuellen Versionen von Raspbian OS ist das Paket raspi-gpio nicht mehr standardmäßig installiert.
Ein Nachinstallieren ist grundsätzlich möglich:

 sudo apt update  
 sudo apt install raspi-gpio  

In meinem Fall trat dabei jedoch ein Fehler auf.


Offenbar ist hier entweder eine Anpassung seitens der Distribution erforderlich – oder das Paket wird nicht mehr vorgesehen.


Pin umstellen (Pin-Multiplexing)

In meinem Fall war GPIO12 als INPUT konfiguriert und musste über Pin-Multiplexing umgestellt werden.

GPIO12 auf PWM0 setzen:

 sudo pinctrl set 12 a0  

Die Änderung sollte ohne Neustart wirksam sein.
Bei mir bewegte sich der Servo danach endlich wie erwartet.


Dauerhaft einstellen

Rückblickend hätte ich diese Konfiguration direkt zu Beginn vollständig setzen sollen.
Hätte ich das früher gewusst, hätte ich mir viele Zwischenschritte erspart, da sich die meisten Lösungsansätze nur auf kurzfristige Workarounds beziehen.

Für eine dauerhafte PWM-Konfiguration muss folgender Eintrag in der Datei
/boot/firmware/config.txt gesetzt werden:

 dtoverlay=pwm-2chan,pin=12,func=4,pin2=13,func2=4  

Danach speichern mit STRG + O, bestätigen mit ENTER, Nano mit STRG + X beenden und anschließend neu starten:

 sudo reboot  

Fazit

Offensichtlich wurde mit der neuen Betriebssystemversion deutlich aufgeräumt. Viele Funktionen scheinen heute durch unterschiedliche Bibliotheken mehrfach vorhanden zu sein oder wurden neu strukturiert.

Erst mit Unterstützung von Microsoft Copilot und ChatGPT bin ich – nach zahlreichen Fragen und Fehlversuchen – auf diese Lösung gestoßen.
Über die klassische Google-Suche bzw. Gemini führte der Weg ebenfalls nicht direkt zum Ziel.

Ein möglicher Grund dafür ist der Wechsel des Raspbian OS von Bookworm auf Trixie, der intern offenbar einige Änderungen an der GPIO- und PWM-Konfiguration mit sich gebracht hat.

Montag, 5. Februar 2024

Problem bei der Entwicklung mit MS Office Interop


So ganz habe ich nicht verstanden warum das Hinzufügen des Nuget Paket Microsift.Office.Interop.Word (andere Office Interop Pakete) nicht ausreicht. Nach dem ich das Paket hinzugefügt habe und versucht habe nur die Application zu instanziieren, bekam ich einen Ausnahmefehler.

 

Verwendete Umgebung

  • Windows 11
  • Visual Studio 2022
  • Office365 Installation

 

Nur zum laufen bringen

Die Consolen Anwendung soll eine Instanz von Word starten.

 

Die Variante, die nicht geht

Zur Vollständigkeit, wie ich zu dem Ausnahmefehler kam, bei der Verwendung des NuGet Pakets.

 


Und zum Testen ein kurzer Code Schnipsel, der eigentlich ausführbar sein sollte.

 using Microsoft.Office.Interop.Word;  
 Console.WriteLine("Start office application! Solution 1");  
 var app = new Application  
 {  
   Visible = true  
 };  
 Console.WriteLine("Office application started!");  
 Console.WriteLine("Press any key to close the application!");  
 Console.ReadLine();  
 // close the application  
 app.Quit();  

Die Assembly Datei konnte nicht gefunden werden, aber ich konnte nicht erkennen woran das lag. Die zu verwendete Assembly landet nach dem Kompilieren ebenfalls im selben Ordner.

 System.IO.FileNotFoundException  
  HResult=0x80070002  
  Message=Could not load file or assembly 'office, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c'. Das System kann die angegebene Datei nicht finden.  
  Source=<Cannot evaluate the exception source>  
  StackTrace:  
 <Cannot evaluate the exception stack trace>  

 

Alternative Lösung

Statt das NuGet Packet zu verwenden, wird bereits auf eine installierte Bibliothek zugegriffen.



Kompiliert und gestartet wird wieder mit dem selben Code Schnipsel.

 using Microsoft.Office.Interop.Word;  
 Console.WriteLine("Start office application! Solution 2");  
 var app = new Application  
 {  
   Visible = true  
 };  
 Console.WriteLine("Office application started!");  
 Console.WriteLine("Press any key to close the application!");  
 Console.ReadLine();  
 // close the application  
 app.Quit();  

Wird die Anwendung ausgeführt, sollte sich die Word Anwendung ohne Seite starten.

 


Drück mit der Consolen Anwendung eine Taste, wird der Schließen Befehl ausgeführt und die Word Anwendung sollte sich dann schließen.

 

Warum geht das (nicht)?

Das habe ich mich auch gefragt und wird zunächst ein offener Punkt bleiben.

Die Installierte Assembly zu verwenden ist klar, dass muss funktionieren. Hat bereits vor 10 Jahren so funktioniert und geht auch heute noch.

Aber wenn man die Office Assembly per NuGet Paket einbinden kann, sollte dies auch gehen. Die Beschreibung von Microsoft (Link) beschreibt bzw. gibt einen Hinweis, dass die Implementierung abweichen kann von der Beschreibung. Dennoch frage ich mich, wo meine Consolen Anwendung schaut, wenn versucht wird das NuGet Paket zu verwenden.

 

Es geht doch (noch)

Im letzten Absatz habe ich mir die Frage schon fast beantwortet. Wenn man nicht gerade auf der aktuellsten .NET unterwegs ist, funktioniert die Beschreibung von Microsoft genau so wie beschrieben. Wenn das Projekt mit .NET Framework 4.8 eingestellt ist, also bevor die .NET Welt aufgeräumt wurde, dann funktioniert dies auch. Code ist praktisch das selbe, nur halt ohne TOP Level Statement.


Samstag, 27. Januar 2024

.NET MAUI - Problem beim Einbinden einer Resource aus andere Assembly


Eigentlich war der Fehler sehr dämlich von mir, aber ich bin wegen der mir unbekannten Fehlermeldung nicht auf das gekommen, was eigentlich die Ursache war. Nachdem ich den Fehler Verstand, dachte ich, ich schreibe das mal auf als Blogeintrag. Aber andererseits habe ich auch zu dem Thema im Internet nichts gefunden.

 

Benötigt

  • Visual Studio 2022
  • Mindestens .NET 7
  • .NET MAUI Application
  • .NET MAUI Library

 

Was ist das Ziel?

Die Styles für die Steuerelemente, sollen über eine andere Assembly geliefert werden. Damit dies funktioniert, muss in der Application die Resource in der App.xaml eingetragen werden. Für das Beispiel ist in der Assembly eine Resource abgelegt mit einem Color Style, welches mit einem Key Wert gesetzt ist. In der Application soll dann der Style mit StaticResource einsetzbar sein.

 

Umfeld für Style aufbauen

In der Resource ist ein Style zu einem Color angelegt. Hier nehme ich eine Sache vorweg, hier fehlt die Klasse und komme im späteren Schritt wieder darauf zurück.

 

Damit meine Application darauf zugreifen kann, muss die Assembly in die Abhängigkeiten hinzugefügt werden.

Rechte Maustaste auf Dependencies und im Kontext Menü 'Add Project Reference'


Dann aus der Projektübersicht der Solution, die zu verwendende Bibliothek auswählen.


In der Anwendung muss in die Datei App.xaml die Reference händisch eingetragen werden. Automatische Vervollständigung funktioniert an der Stelle nur zum Teil.


Nun der Merge, um hier die Styles einzubinden. Das Unterstreichen zeigt uns an der Stelle ein Problem.


Am Anfang habe ich bereits erwähnt, dass in der Datei CodexzierTheme.xaml die Klasse fehlt.


Also bringen wie die Klasse noch ein.


Der Fehler in der Anwendung aus der Datei App.xaml ist nun weg.


Auf der MainPage.xaml, habe ich ein Rechteck, welches als Hintergrundfarbe den Style aus der Assembly bekommt. Leider lässt sich das nicht über die Autovervollständigung nicht eintragen.

 

Bis hier her, sieht die Sache in Ordnung aus, mit Ausnahme, dass die Ressource hier nicht gefunden wird über IntelliSense. Ich starte die Anwendung mit F5 und direkt nach dem Start erhalte ich bereits meinen Fehler, den ich bereits als Titelbild gewählt habe.

 

Was fehlt?

Eigentlich sollte klar sein, dass hier die Klasse selbst für die Resource fehlt. In WPF, Silverlight, UWP und XAML musste die Klasse nicht mit eingebunden werden. Bei Xamarin habe ich keine Erfahrungswerte.

 

Per Copy und Paste, habe ich meine ResourceDictionary Datei und nur Namentlich angepasst. Was ich zu diesen Punkt nicht wusste, dass im .NET MAUI zur ResourceDictionary ebenfalls eine Partial Klasse zugeordnet wird.

Nach dem ich zum testen eine ResourceDictionary aus dem .NET MAUI-Templates hinzugefügt habe, war schon gleich der unterschied zu sehen.


Nachdem ich dies so übernahm, ging auch der Aufruf über IntelliSense …


… und die Anwendung ließ sich dann starten mit der gewünschten Farbe aus dem Style.

 

Schlusswort

Wenn das auf der Microsoft Seite so steht, dann funktioniert das auch in der Regel. Das wäre mir auch neu gewesen, wenn eine Beschreibung nicht dem entspricht. Aber meine Erfahrung hat mich an der Stelle in die irre geführt. Die Suche über das Internet ergab ähnliche Ergebnisse, aber keines wies darauf, welche Abhängigkeiten im Umfeld notwendig sein sollten, damit das Einbinden von Resourcen aus einer anderen Assembly funktioniert.


Links

Resource dictionaries - .NET MAUI | Microsoft Learn

Mittwoch, 4. Oktober 2023

Unity 3D Projekt mit Blender Dateien werden nicht geladen

 

Wenn im Unity Projekt der Fehler auftritt, dass Blender Dateien nicht geladen werden, dann liegt zunächst der Gedanke fern, dass die installierte Anwendung Blender ein Problem darstellt.

Wie ich zu dem Problem kam. Nun ich hatte zuerst mein Projekt wie immer in ein GitHub Repository untergebracht und wollte dann mein Projekt auf einem anderem System weiterbearbeiten. Zuerst dachte ich, irgendetwas im Projekt habe mit GitHub nicht Commitet, bis ich den richtigen Hinweis bekam, dass Blender (richtig) installiert sein muss.

 

Inhalt

  • Unity 3D
  • Blender Installation
  • 3D Objekte im Blender Datei Format

 

Szenario

Zwei Systeme auf dem Entwickelt wird, haben die selbe Software für die Entwicklung. Das zweite System wird Verwendet, um zu prüfen, ob das Spiel auf einem Schwächerem System funktioniert. Zum Synchronisieren der Sourcen, wird GitHub verwendet und das Repository ist für Unity 3D Projekte eingerichtet.

Auf beiden System ist Blender "Installiert" aber auf dem zweit System werden die Blender Dateien in Unity 3D nicht geladen und im Öffnen Prozess erscheinen mehere Meldungen.

 

Unterschied der Installation

Man kann auf verschiedenen Wegen Blender installieren. Man kann über Steam oder über den Microsoft Store das Programm Blender installieren.


Vorteil, das Programm wird aktuell gehalten.


Da ich selbst nicht immer auf dem neuesten Stand bin, wie man Blender verwendet, habe ich auf meinem Hauptentwicklungssystem Blender von der Blender Seite die Installationsdatei heruntergeladen und installiert.

Auf dem zweiten System habe ich Blender über dem Microsoft Store installiert. Was mir bis dato nicht mehr bewusst war, dass installierte Apps aus dem Microsoft Store in einer eigenen Sandbox laufen, so dass die Apps nur eingeschränkten Zugriff auf das System haben. (Korrigiert mich, wenn ich falsch liege).

 

Lösung

Wenn man im Unity Projekt allgemein Blender Dateien verwendet, dann muss zwingend Blender auf dem System über den herkömmlichen Weg installiert sein. Also die Setup Datei von der Blender Seite herunterladen und die Installation Ausführen. Blender Download

 

Nach Installation von Blender und starten von Unity 3D, sollten die Blender 3D Dateien mit dem Blender Icon oder eine Vorschau des 3D Modells zu sehen sein.

 

 

Sonntag, 5. Februar 2023

Unable to open Video Device

Das Internet ist voll mit Vorschlägen, die leider unbrauchbar sind. Nicht das ich faul bin, mich mit dem Thema weit genug auseinanderzusetzen, um die Ursache zu verstehen. Man will einfach die Sache lösen und sich auf das konzentrieren, was eigentlich auf dem Plan steht.

 

Umfang

  • Raspberry Pi mit Raspberry Pi OS
  • Installation ioBroker

 

Das Problem

Nach der Installation von ioBroker, rief ich über den Browser die Adresse meines Raspberry PI mit der Portnummer 8081 auf und erhielt den Fehler 'Unable to open Video Device', den ich hier als Teil des Titels und Titelbild verwendet habe.

 

Lösungsansätze

Vom Linux ein Update, Upgrade und co. ausführen hat nicht geklappt.

 

Ursache

Eigentlich sagt die Fehlermeldung bereits aus, um was es sich handelt. Aber aus irgendeinen Grund dachte ich: "Warum braucht ioBroker die Videoschnittstelle?". Falsche Fragen führen zu falschen Schlüssen.

Statt über Port 8081 rief ich die Seite mit Port 8080. Und siehe da, da ist das Problem Denn ich hatte tatsächlich noch Motion installiert, dass ich mal Anfangs mal verwendete, um mit der Kamera ein paar versuche zu starten. Das Programm nutzt auf dem Port 8081 die Wiedergabe der Kamera, die aktuell nicht angeschlossen war.

 

Lösung

Runter mit dem Programm.

 sudo apt-get remove --purge motion  

 

Was lernen wir daraus?

Entweder schaut man sich an, was man eigentlich installiert hat oder Dokumentiert was alles auf dem Raspberry Pi läuft und eingerichtet ist. Zu meiner Schande ist meine Orientierung auf Linux Systeme so gut wie im Dunkeln durch ein Labyrinth zu laufen.

 

Sonntag, 15. Mai 2022

Windows 11 und langsame VirtualBox


Im Wandel von Updates kommt mit der Zeit auch ein neues Windows. Und leider funktioniert nicht immer alles. Sehen wir davon ab, das VirtualBox weitgehend Kostenlos ist und deshalb nicht gewährleistet wird, dass alle Umstände funktionieren oder unterstützt werden.

 

Verwendet

  • Windows 11 (oder Windows 10)
  • VirtualBox
  • Virtualisiertes System mit Windows 2000 Professional

 

Problem Beschreibung

Nach einem größeren Update oder mit dem Wechsel von Windows 10 auf Windows 11, kann das Ausführen von Virtuell Box sehr langsam werden. Man kann praktisch sehen wie Pixel für Pixel das Bild aufgebaut wird.

 

Ursache

Nun im Grunde kenne ich nicht die eigentliche Technische Ursache, warum ein eingeschaltetes Feature in Windows 11 für Virtuelle Maschinen Probleme erzeugt. Vielleicht hilft diese Beschreibung, die ich in den Weiten des Internets gefunden habe. (https://www.pctipp.ch/praxis/virtualisierung/quaelend-langsame-virtualbox-unter-windows-11-2742835.html?page=1_abhilfe-hyper-v-sandbox-nbsp---weg-damit)

 

Lösung des Problems in Windows 10

Drücke auf die Windows Taste und gebe 'Windows-Features aktivieren oder deaktivieren' ein

 

Dann deinstalliert ihr die Features durch das Entfernen der gesetzten Hakens.

  • Hyper-V
  • Windows-Hypervisor-Plattform
  • Windows Sandbox

 

Anschließend Ok und das Betriebssystem neu starten.

 

Lösung des Problems in Windows 11

Im Grunde das gleiche. Nur halt mit runden Ecken. 

An einem anderem System konnte ich feststellen, dass nicht zwingen alle Punkte aufgeführt sein müssen. Denn je nach Hardware Unterstützung werden auch nur die Optionen wieder gegeben, die auch wirklich unterstützt werden.


Dienstag, 28. September 2021

Error Text ausgeben bei einer Stored Procedure in C# Anwendung


Vielleicht ist das, worauf ich diesmal eingehe selbstverständlich, aber ich habe zu dem Thema ein wenig gesucht und mal wieder nichts gefunden. Wenn ich in meiner Anwendung eine Stored Procedure ausführe, dann würde bei einem Fehler keine Rückmeldung von der Ausgeführten Prozedur kommen und der Eindruck entsteht, dass die gespeicherte Prozedur normal durchgelaufen ist. Nun kann man auch einen Output Wert einrichten und erwarten, das ein entsprechender Wert herauskomm. Käme nun ein Standard Wert heraus, könnte daraus geschlossen werden, dass etwas in der Prozedur nicht gemacht macht wurde. Ohne Detail Information, kann man alles vermute. Fehler im Script, keine Ausreichende Berechtigung vergeben oder Datensatz hat einen Fehler. Was auch immer. Schöner wäre einen Fehlertext zu erhalten.

 

Benötigt

  • MS SQL Datenbank
  • Visual Studio 2019

 

Ziel

Das Beispiel soll ein Wert zurück geben, wenn die Stored Procedure ohne Fehler ausgeführt wurde. Bei einem Ausnahmefehler soll wiederum der Fehler Text Ausgeben werden in der Anwendung.

 

Beispiel Prozedur anlegen

Die Folgende Prozedur kann in ihrer Ausführung normal durchlaufen und den erwarteten Ausgangs Wert in 'myGetStatusMessage' ausgeben. Wird der Parameter 'showMeErrorMessage' auf 1 gesetzt, dann wird eine Ausnahme geworfen.

 USE [example-data]   
 GO  
 SET Ansi_Nulls ON  
 GO  
 CREATE PROCEDURE [dbo].[myStoredProcedure]    
   @showMeErrorMessage AS BIT,   
   @myGetStatusMessage AS NVARCHAR(20) OUTPUT,     
   @myStoredProcedureErrorMessage NVARCHAR(100) OUTPUT   
 AS  
 Begin Try  
   IF @showMeErrorMessage = 1  
   Begin  
     THROW 123, 'Eine Ausnahme wurde geworfen', 1;   
   end  
   SELECT @myGetStatusMessage = 'Alles in Ordnung!'   
 end try  
 begin catch  
   SELECT @myStoredProcedureErrorMessage = ERROR_MESSAGE();  
 end catch  

 

Beispiel C# Anwendung

Nun zu einer Consolen Anwendung, die den Aufruf einer gespeicherten Prozedure ausführen kann und auch unter Ziel Bedingungen den Fehlertext ausgeben kann, dass durch den Catch Block der Prozedur ausgefüllt wurde.

 

 using System;  
 using System.Data.SqlClient;  
 Console.WriteLine("Ein Beispiel wie man eine Error Meldung aus einer Store Procedure ausgegeben werden kann");  
 Console.WriteLine("Store Procedure wird ausgeführt ohne Ausnahmefehler!");  
 RunStoreProcedure(false);  
 Console.WriteLine("\r\nStore Procedure wird ausgeführt mit Ausnahmefehler!");  
 RunStoreProcedure(true);  
 Console.WriteLine("\r\nPress enter to close application");  
 Console.ReadLine();  
 static void RunStoreProcedure(bool throwError)  
 {  
   var connection = new SqlConnection(  
     @"server=127.0.0.1,1433;User Id=CustomUser;Password=passwort;Database=example-data;");  
   connection.Open();  
   var query = "DECLARE @StatusOutput AS NVARCHAR(20), @ErrorOutput AS NVARCHAR(100);" +  
         $"EXEC [dbo].[myStoreProcedure] {(throwError ? 1 : 0)}, " +  
         "@StatusOutput OUTPUT, " +  
         "@ErrorOutput OUTPUT; " +  
         "SELECT @StatusOutput AS Status, @ErrorOutput AS Error";  
   var command = new SqlCommand(  
     query,   
     connection);  
   var reader = command.ExecuteReader();  
   while (reader.Read())  
   {  
     Console.Write("Ergebnis: ");  
     for (var iColumn = 0; iColumn < reader.GetColumnSchema().Count; iColumn++)  
     {  
       Console.Write($"{reader.GetValue(iColumn)}, ");  
     }  
     Console.WriteLine("");  
   }  
   connection.Close();  
 } 

 

That's it

Der Umfang ist übersichtlich und kann in den meisten Fällen für eine Anwendung in der Form eine Store Procedure ausführen. Was nicht so einfach ist, wenn eine Tabelle zurück gegeben wird und dort die Möglichkeit statt der Ergebnis Tabelle, wiederum einen Fehlertext auszugeben.

 

GitHub - ExampleStoreProcedureErrorOutput

Sonntag, 28. März 2021

Da will man wieder... (Meadow)


Seit Monaten lag mein Meadow Microcontroller unbenutzt im Schrank, wie auch die eingekauften Sensoren, die teilweise noch verpackt waren. Mein Ziel war eigentlich am Samstag ein neues Code-Beispiel zusammen zu schreiben für die Verwendung eines CO2 Sensor im .NET Umfeld.

Also begann ich mit dem Lesen von Dokumentationen und bereits bestehenden Code aus der C++ Welt und schrieb entsprechend dann die .NET Lösung. Dann sollte der Programmcode auf den Meadow geschrieben werden … aber es kam anders. Ein Blogeintrag über das Suchen und Finden von Fehlern, bevor ein Blogeintrag entsteht..


Fehler beim Verwenden von Dingen

Nicht aussagekräftige Fehler können einen aufhalten und kosten Zeit. Letztes Mal war es das Bereitstellen mit F5, welches bei allen Anwendungen zum Kompilieren und Starten genutzt wurde, welches aber bei dem Meadow nicht so funktioniert. Hier muss mit der rechten Maus-Taste auf das Projekt und anschließend auf Deploy geklickt werden. Einfach, aber so etwas kann einen echt ausbremsen.
 

Dieses Mal trat der Fehler beim Verwenden der Komponenten aus dem Meadow Framework auf, welches folgende Meldung im Debug Output zeigte:

ioct1 Esp32Command failed OperationNotPermitted

Der Satz sagte mir nicht, dass meine MeadowOS Version zu alt ist. Mein letztes Projekt vom August 2020 verblieb bis zuletzt unverändert. Aber auch diese funktionierte nicht mehr und stieg mit der Fehlermeldung aus, dass die Datei Mono.Security.dll nicht gefunden wurde.

Welche Abhängigkeiten habe ich hier an der Stelle, wenn ich nicht das NuGet Packet Meadow.Foundation v0.17.0 und sowie auch das .NET Framework 4.7.2  geändert habe?


Das alleine reichte nicht

Wenn ich Deploy geklickt hatte, dann hing Visual Studio. Das ließ sich beheben, indem ich die USB- Verbindung zum Meadow trennte. Idealerweise muss man auf dem Meadow nur den Reset Button drücken, damit das Deployment weiter fortschreitet.

 

Niemals ein funktionierendes System ändern?

Oder besser bekannt: never change a running system. Wieso also kann es nicht weiterhin funktionieren, wenn man nichts verändert? OK, ich habe Visual Studio 2019 immer aktualisiert, aber ich aktualisiere nicht immer die einzelnen Projekte. Außer das verwendete Framework ist so alt, das man dessen Frameworks nachinstallieren muss.

Ich habe eine alte Windows Form Anwendung, die selbst nach über 12 Jahre immer noch geht. Ok, ich muss hier .NET Framework 2.0 nachinstallieren, welches automatisch nachgefragt wird, und nur noch zustimmen.

 

Aktualisierung benötigt

Weiter geht’s: Ich komme nicht dran vorbei, die entsprechenden Aktualisierungen am Projekt vorzunehmen und auch den Meadow mit einer aktuelle OS Version zu flashen. Auf der Webseite 'Wilderness Labs' kann man die aktuellen Binaries herunterladen.
Wie sich später herausstellte, sind es zwei Zip Datei. Beim nochmaligen Durchlesen der Beschreibung "Deploy Meadow OS" stellte ich fest, dass die Beschreibung selbst aktualisiert wurde.
Finde ich gut, aber der Textaufbau auf der Seite ist nicht linear und erschwert das Lesen, obwohl die Beschreibung relativ sauber beschrieben ist. Mal ist der auszuführende Befehl rechts und mal direkt im Text eingerückt. Vielleicht eine Kleinigkeit und vielleicht ein Problem meiner Wahrnehmung, weil ich scheuklappenartig den Text lese und am Rand eh nur Werbung vermute (Anmerkung an der Stelle, auf der Webseite sind keine Werbe Ads vorhanden).

 

Schritt für Schritt

Gehen wir also nochmal Punkt für Punkt die Beschreibung durch:

Haste .NET 5.0 SDK?
Nein. Wird also installiert.

Wie sieht es mit Meadwo.CLI aus?
Auch nicht. Wird installiert.

Update USB Treiber für Bootloader?
Noch aktuell.

Aktuelle Meadow OS und Network Binaries?
Hatte ich heruntergeladen.
Später sah ich rechts im blauen Feld den Befehl, mit dem sich die aktuellen Version einfach in den vorgesehenden Ordern herunteladen lässt und dessen ZIP Inhalt auch automatisch entpackt. (COMMAND: meadow --Download)

Meadow in den Bootloader Modus umschalten?
Geht. Boot Button gedrückt halten und dann anschließen.

Meadow.OS und Coprocessor Firmware flashen mit dem Befehl: meadow --FlashOS?
Geht nicht. Endet mit der Unbehandelten Ausnahmefehler: System.ComponentMode.Win32Exception

Grrrr… Why?!?

 

Die Community fragen

Davon verspreche ich mir in der Regel nicht viel. Anscheinend ist das Thema 'Lösungen' in einem Forum untergegangen, seit dem Stackoverlfow exisitiert. Damit will ich nicht ausschließen, dass sich dort keine Lösungen finden. Man muss halt nur ein paar mehr Seiten lesen und nicht hilfreiche Kommentare ertragen.

Meine letzte Frage in dem Forum wurde bis heute nur von mir selbst beantwortet. Vielleicht peinlich, dass ich nicht mehr wusste, dass die Nutzungserfahrung für das Bereitstellen beim Meadow nicht mehr gelten.

Dass eine Frage von mir nicht von einem anderen User beantwortet wurde, ist nicht das erste Mal. Gleiches Forum, anderer Microcontroller. Fairerweise muss man sagen, dass dort nicht viele Nutzer aktiv sind und auch somit nicht viel geantwortet wird.

 

Try and Error

Nacheinander habe ich die Meadow OS Versionen heruntergeladen und dessen Inhalt betrachtet. In älteren Version fand ich auch dann die damalige verwendete CLI. Leider fand ich den verwendeten Befehl nicht wieder und wusste auch nicht direkt, nach was ich im Netz suchen musste.

Einen Tag später suchte ich weiter nach einer Lösung und stellte fest, dass ich wohl ein Problem mit dem Dfu-util hatte beziehungsweise dieser schlicht weg fehlte. Der folgende Befehl installiert das Tool in den Windows/System32 Order. Ggf. muss CMD oder PowerShell als Administrator ausgeführt werden.

meadow --InstallDfuUtil

Nach dem Installieren konnte nun endlich der Flashvorgang erfolgreich durchgeführt werden.
Nun erklärte sich mir ENDLICH die zuvor aufgetretene Exception, welches als Information nicht aus der Meadow.Cli ausgegeben wurde.
Ok, vielleicht hätte der Fehlertext "…\DfuUpload.cs:line 141 …" mich darauf aufmerksam machen sollen.


Endlich den Meadow benutzen… oder auch nicht

Nachdem ab- und anschließen des Meadow Boards und öffnen der Solution, führte ich den 'gewohnten' Deploy Vorgang aus. Die Spannung stieg!!
Ich sah zu, wie im Output Fenster die Daten hochgeladen wurden. Beim letzten Eintrag wechselten hier der Tab zu "Error List". Hier wurde nichts angezeigt, dafür stand im letzten Eintrag vom "Output" einer neuen Exception… Grrr

Erfolgreich, aber die MeadowClie scheint nicht zu funktionieren

 

Zurück zur Beschreibung

Wiederholt rief ich die Beschreibung auf Wilderness Lab auf und versuchte zu deuten, ob der Schritt drei danach richtig eingerückt war oder noch zu der Beschreibung mit Linux gehörte. Anscheinend ist Schritt drei wirklich Schritt drei und somit war der Aktualisierungsvorgang noch nicht durch. Folgender Befehl:

meadow --MonoDisable -s [PORT]

Wenn der Befehl hängt, dann Reset-Button auf dem Meadow Board und nochmal.


Dann…

meadow --MonoUpdateRt

… und wenn es wieder hängt, Reset und nochmal.


Und zuletzt noch einer…

meadow --FlashEsp

… der sollte anschließend normal durchlaufen.

 

USB Stecker ab- und wieder anschließen

Kommt mir vor wie bei Karate Kid mit auftragen und polieren. War der Vorgang erfolgreich, sollte das Demo Programm laufen. Das ist dann daran zusehen, wenn die LED ständig die Farbe wechselt.


Endlich den Meadow benutzen… yeah es geht

Langer Weg zum Ziel und ich kann mein eigentliches Vorhaben wieder aufnehmen. Das kommt dann mit dem nächsten Blogeintrag. Wenn nicht schon wieder ein Update ansteht...


Rückblickend

Letzten Endes fehlten mir die Erfahrungen mit welche Probleme ich rechen muss.
Ärgerlich, wenn so viel Zeit mit dem Suchen nach Fehlern drauf geht. Keine Ergebnisse zu finden und dabei auf der falschen Fährte unterwegs zu sein. Deshalb schrieb ich diesen Eintrag, allerdings brachte mich meine Freundin darauf, diesen Vorgang zu einem eigenen Thema zu machen.
Und eigentlich sind die Wege zu den Lösungen zu unserer Problemen, die wir als Bastler im Internet suchen, auch mal ein Beitrag wert.

Ameisen Simulation und andere Dinge

Wer lange sich schon mit C# beschäftig, hat sicherlich schon mal was von AntMe gelesen oder gehört. Diese Idee hatte ich aufgegriffen und mi...