CChris Geschrieben October 21, 2016 at 06:14 Geschrieben October 21, 2016 at 06:14 Hallo Zusammen, ich habe gerade ein kleines Problemchen, bei welchem ich nicht wirklich durchblicke :-( Ich habe eine kleine Testanwendung geschrieben, welche mir ähnlich wie der BrickViewer erst einmal alle Bricks und Bricklets anzeigt, die angeschlossen sind. Dazu führe ich folgenden Code aus: public partial class Form1 : Form { private static string HOST = "localhost"; private static int PORT = 4223; IPConnection ipcon = new IPConnection(); public Form1() { InitializeComponent(); // Register IP Connection callbacks ipcon.EnumerateCallback += EnumerateCB; //ipcon.Connected += ConnectedCB; this.FormClosing += Form1_FormClosing; } private void EnumerateCB(IPConnection sender, string UID, string connectedUID, char position, short[] hardwareVersion, short[] firmwareVersion, int deviceIdentifier, short enumerationType) { if (enumerationType == IPConnection.ENUMERATION_TYPE_CONNECTED || enumerationType == IPConnection.ENUMERATION_TYPE_AVAILABLE) { string deviceName = ""; // DeviceIdentifier in lesbaren Text umwandeln switch (deviceIdentifier.ToString()) { case "11": deviceName = "DC Brick"; break; ... } if (connectedUID == "0") { connectedUID = "--"; } //Baue ListenItems auf string[] myItems = new string[5]; if (position == '\x0030') { myItems[3] = "--"; } else { myItems[3] = position.ToString().ToUpper(); } myItems[0] = deviceName; myItems[1] = UID; myItems[2] = connectedUID; ListViewItem LVItem = new ListViewItem(myItems); try { listView2.Invoke(new Action(() => listView2.Items.Add(LVItem))); } catch (Exception exceptionMsg) { MessageBox.Show(exceptionMsg.Message, "Fehler!", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Error); } } if (connectedUID == "0") { connectedUID = "--"; } //Baue ListenItems auf string[] myItems = new string[5]; if (position == '\x0030') { myItems[3] = "--"; } else { myItems[3] = position.ToString().ToUpper(); } myItems[0] = deviceName; myItems[1] = UID; myItems[2] = connectedUID; ListViewItem LVItem = new ListViewItem(myItems); try { listView2.Invoke(new Action(() => listView2.Items.Add(LVItem))); } catch (Exception exceptionMsg) { MessageBox.Show(exceptionMsg.Message, "Fehler!", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Error); } } } private void button1_Click(object sender, EventArgs e) { // Connect to brickd, will trigger cb_connected try { ipcon.Connect(HOST, PORT); //MessageBox.Show("Connected: " + IPConnection.CONNECTION_STATE_CONNECTED.ToString(), "2"); } catch (Exception exceptionMsg) { MessageBox.Show(exceptionMsg.Message + "\n\nDas Programm wird beendet.", "Fehler!", MessageBoxButtons.OK, MessageBoxIcon.Error); this.Close(); } try { ipcon.Enumerate(); //MessageBox.Show("Connected: " + IPConnection.CONNECTION_STATE_CONNECTED.ToString(),"3"); } catch (Exception exceptionMsg) { MessageBox.Show(exceptionMsg.Message, "Fehler!", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Error); } } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { if (e.CloseReason == CloseReason.UserClosing) { MessageBox.Show("Connected: " + IPConnection.CONNECTION_STATE_CONNECTED.ToString(), "4"); // Prompt user to save his data // CONNECTION STATE = 1, obwohl noch keine Verbindung aufgebaut wurde... ? if (IPConnection.CONNECTION_STATE_CONNECTED == 1) { try { ipcon.Disconnect(); } catch (Exception exceptionMsg) { MessageBox.Show(exceptionMsg.Message, "Fehler!", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Error); } } listView2.Clear(); MessageBox.Show("Tinkerforge Disconnected", "Anwendungsstop!", MessageBoxButtons.OK, MessageBoxIcon.Information); } } } } Das Phänomen: Obwohl das Connect erst nach klick auf den button1 stattfindet - erst dann baut er mir die Liste auf, welches im EnumerateCB mit drin steht, bekomme ich für die Abfrage im Form1_FormClosing bei IPConnection.CONNECTION_STATE_CONNECTED den Wert 1 zurück. Bezieht sich dies nur auf die reine USB-Verbindung? Ist also nur dann 0, wenn der USB Stecker gezogen ist? Wenn ja, wie sollte ich die Abfrage ändern, damit die "Verbindung" zu den Bricks getrennt wird? Danke schon mal und Gruß, Christoph Zitieren
markus5766h Geschrieben October 21, 2016 at 06:25 Geschrieben October 21, 2016 at 06:25 ... Wenn ja, wie sollte ich die Abfrage ändern, damit die "Verbindung" zu den Bricks getrennt wird? ich trenne die Verbindung mit ipcon.Disconnect (DELPHI) sollte auch in anderen Umgebungen so sein ---> o.k., hatte ich übersehen, ist im Form.Close drin, ich vermute, dass sich das Connection-State auf die interne Verbindung, aufgebaut durch die Treiber, bezieht - sonst mal in den entspr. Bindings nachschauen, welcher Rückgabewert für connected wann erzeugt wird. Zitieren
CChris Geschrieben October 21, 2016 at 07:45 Autor Geschrieben October 21, 2016 at 07:45 Ja, genau das mache ich auch. if (IPConnection.CONNECTION_STATE_CONNECTED == 1) { try { ipcon.Disconnect(); } catch (Exception exceptionMsg) { MessageBox.Show(exceptionMsg.Message, "Fehler!", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Error); } } Folgendes verhalten: Setze ich das ipcon.Disconnect nicht in eine try/catch block, beendet sich das programm wegen einer nicht behandelten eception. Der Tinkerforge.NotConnected (o.ä. Genauen Text hab ich jetzt nicht im Kopf). Ich kann also kein Disconnect machen, weil kein Connect abgesetzt wurde. Meine Lösung daher mit der if abfrage. Nur: Der Code springt IMMER in den if Block rein und gibt mir in einer msgbox, welche ich testweise mal mit rein gebaut habe den CONNECTION_STATE mit 1 aus. Springt dann aber in den catch block und wirft die exception, dass keine Verbindung besteht. Das verwirrt mich Zitieren
photron Geschrieben October 21, 2016 at 07:46 Geschrieben October 21, 2016 at 07:46 IPConnection.CONNECTION_STATE_CONNECTED ist eine Konstante. Die ist immer 1. Den Zustand der Verbindung gibt ipcon.GetConnectionState() zurück. Diesen Rückgabe Wert kannst du dann mit IPConnection.CONNECTION_STATE_* vergleichen, um zu sehen ob die IPConnection *_DISCONNECTED, *_CONNECTED oder *_PENDING ist. ipcon.GetConnectionState() sagt dir nichts über einzeln Brick(let)s aus, sondern sagt dir wie die Verbindung zum Brick Daemon, zur WIFI oder zur Ethernet Extension ist. Zitieren
CChris Geschrieben October 21, 2016 at 07:52 Autor Geschrieben October 21, 2016 at 07:52 Meh. Danke War dann wohl gestern zu spät dafür ^^ Wenn ich einzelne bricklets abfragen möchte, dann muss ich ja ein connect mit der jeweiligen uid des bricklets absetzen, richtig? Wie kann ich ggf. hier überprüfen, ob noch eine Verbindung besteht? Oder denke ich jetzt in die falsche Richtung? Zitieren
photron Geschrieben October 21, 2016 at 09:02 Geschrieben October 21, 2016 at 09:02 Es gibt in dem Sinne keine Verbindung zu den einzelnen Brick und Bricklets. Du verbindest dich mit der IPConnection zum Brick Daemon, oder zur WIFI oder Ethernet Extension und kannst dann darüber die einzelnen Bricks und Bricklets erreichen. Der Enumerate Callback sagt dir dann welche Bricks und Bricklets du gerade als Stack per USB an oder abgesteckt hast. Einen Stack den du über WIFI oder Ethernet Extension erreichst ist fest und kann sich zur Laufzeit nicht ändern. Zitieren
markus5766h Geschrieben October 21, 2016 at 09:26 Geschrieben October 21, 2016 at 09:26 ... Wenn ich einzelne bricklets abfragen möchte, dann muss ich ja ein connect mit der jeweiligen uid des bricklets absetzen, richtig? Wie kann ich ggf. hier überprüfen, ob noch eine Verbindung besteht? Oder denke ich jetzt in die falsche Richtung? im Zweifelsfall mit einer Datenabfrage in einem Try-Except bzw. Try-Catch-Ressourcenschutzblock, evt. als Funktion mit boolschem Rückgabewert. Man könnte zwar beim Connect eine Statusvariable initialisieren, diese bekommt aber von z.B. dem Abziehgen des USB-Steckers nichts mit. Zitieren
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.