Hallo, nachfolgend der Code meiner Klasse für einen Solarladeregler.
Irgendwie hat das schon funktioniert, aber anscheinend muss ich da was verändert haben.
Ich komme jedenfalls nciht drauf, vielleicht kann mir hier jemand sagen was ich da falsch mache?
Wenn ich die Klasse instanziere entsteht beim Aufruf des Konstruktors folgende Fehlermeldung und die CPU Auslastung steigt auf 100% und bleibt da bis ich das Programm abbreche.
System.IO.IOException: Der E/A- Vorgang wurde wegen eines Threadendes oder einer Anwendungsanforderung abgebrochen.
public SolarController()
{
try
{
serial = new SerialPort("COM1", 1200, Parity.None, 8, StopBits.One);
serial.Handshake = Handshake.None;
serial.Open();
serial.WriteTimeout = 500;
serial.ReadTimeout = 2000;
serial.Write("F" + serial.NewLine);
string line = serial.ReadLine();
if (line.Length != 42)
connok = true;
}
catch (Exception oje)
{
build_130606_0035 = "Constructor: "+oje;
}
}
public string getInfo()
{
string status = "nicht verbunden";
if (connok)
status = "verbunden";
return "SolarController "+status;
}
public bool getInfo(bool egal)
{
if (connok)
return true;
else
return false;
}
public string[] getValues()
{
string[] values = new string[0];
try
{
if (!serial.IsOpen)
serial.Open();
serial.WriteTimeout = 500;
serial.ReadTimeout = 2000;
serial.Write("F" + serial.NewLine);
string line = serial.ReadLine();
if (line.Length != 42)
{
string[] sepa = {";"};
values = line.Split(sepa, StringSplitOptions.None);
connok = true;
}
else
{
}
}
catch (Exception oje)
{
build_130606_0035 = "getValues: " + oje;
}
return values;
}
public void delMINMAX()
{
try
{
if (!serial.IsOpen)
serial.Open();
serial.WriteTimeout = 500;
serial.Write("L" + serial.NewLine);
}
catch (Exception oje)
{
build_130606_0035 = "delMINMAX: " + oje;
}
}
}
Vielen Dank, avlbger
Hallo avlbger,
hast du vieleicht ein Kabel ohne das etwas am anderen Ende dran ist am Serial Port angeschlossen, in diesem Fall wird ein Loop am Port erzeugt. Ansonsten kann ich dir nur Debuggen empfehlen mit einem oder mehreren Haltepunkten um zu sehen was dein Proggi macht, da die Fehlermeldung ja von dir erzeugt wird in dem du das Proggi abbrichst.
Gruß
Orgel
So wie ich das sehe, wartet er bei serial.ReadLine() auf Daten vom COM-Port. Wenn die innerhalb der Timeout-Zeit nicht kommen, kommt es zu einer Ausnahme. Sieht so aus, als ob die Datenübertragung mit dem Gerät nicht zustande kommt. Reagiert der Solarregler auf 'serial.Write("F" + serial.NewLine);' irgendwie (Piepsen, Display, LED)?
Du könntest auch mal das DataReceivedEvent der SerialPort-Klasse behandeln. So solltest Du auf jeden Fall mitkriegen, ob der Solarregler auch wirklich was sendet.
Die Fehlerbehanlungen bzw. Ausgabe habe ich erst hinzugefügt als mein Programm aus unerfindlichen Gründen auf 100 % CPU-Auslastung ging und ich durch ausklammern einzelner Codeteile daraufgekommen bin dass es an der Solarcontrollerklasse liegt. Beim Beenden des Programmes kam dann nur das übliche "Fehlerbericht an Microsoft senden" und dort war die Fehlermeldung nur "System.IO.IOException". Darum habe ich hinzugefügt, damit ich vielleicht etwas ausführlicheres bekomme, was ja bedingt auch geklappt hat.
Der Solarcontroller funktioniert jedenfalls. Mit HyperTerminal zb bekomme ich sofort antwort. Ich habe den Timout auch schon ausgeklammert, damit er sich länger Zeit lässt 😉 Leider selbiges Ergebnis.
Ich konnte auch schon Daten auslesen mit obigem COde. Anscheinend muss ich irgendwas verändert haben, dass es plötzlich nicht mehr geht, aber ich hab echt keine Ahnung was ich denn da gemacht habe.... heul
Gruß, avlbger
Keine Ahnung, ob es hilft, aber ich hatte schon öfter Probleme mit dem Encoding der RS232 Komponente.
Lass Dir mal die Rohdaten ausgeben, die vom ReadLine geliefert werden.
Übrigens, ich lasse mir die Fehlermeldung nach dem Aufruf des Konstruktors per MessageBox anzeigen, die Fehlermeldung "System.IO.IOException: Der E/A- Vorgang wurde wegen eines Threadendes oder einer Anwendungsanforderung abgebrochen."
entsteht also schon BEVOR ich das Programm abbreche!
Sieh mal nach, welcher Zeilentrenner bei der Serial Komponente angegeben ist.
ReadLine() verursacht glaube ich nen Fehler, wenn der Trenner nicht innerhalb einer bestimmten Zeit kommt. Gibt gestimmt auch eine TimeOut Eigenschaft für sowas.
Hallo Leute,
Tja, was soll ich sagen, CPU-Auslastung 5%, keine Exception, alles TIP TOP, .....NUR,
ICH HAB VERDAMMT NOCHMAL NICHTS GEÄNDERT!!!!
Ich bin mir ja schon bewusst, dass so ein Computer ja eigentlich immer nur das macht was man ihm sagt oder wie man IHN programmiert, auch wenns einem manchmal schwer fällt das zu glauben,ABER ich kapiers echt nicht 😉
Immerhin funktionierts und ich hoffe das bleibt so,
schönen Tag allen, genießt den Sommer 😉
avlbger