CChris Posted October 30, 2016 at 02:12 AM Posted October 30, 2016 at 02:12 AM Hallo Zusammen, mir ist gerade Aufgefallen, dass der RED Brick in meinem Programm Doppelt aufgeführt wird, wenn ich mich über die IP / Wlan auf meinen Stack verbinde. Läuft die Verbindung über USB / localhost, dann wird er mir nur einmal in meiner Liste angezeigt. Liegt das ggf. am BrickD auf dem RED? Sonst habe ich im Programm noch nichts, was irgendwie hier eine Rolle spielen dürfte / sollte... ?! Folgender Code: 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[] myItems = new string[5]; if (connectedUID == "0") { connectedUID = "--"; } string deviceName = GetDeviceName(deviceIdentifier.ToString()); myItems[0] = deviceName; myItems[1] = UID; myItems[2] = connectedUID; if (position == '\x0030') { myItems[3] = "--"; } else { myItems[3] = position.ToString().ToUpper(); } myItems[4] = firmwareVersion[0] + "." + firmwareVersion[1] + "." + firmwareVersion[2]; ListViewItem LVItem = new ListViewItem(myItems); try { listView1.Invoke(new Action(() => listView1.Items.Add(LVItem))); } catch (Exception exceptionMsg) { MessageBox.Show(exceptionMsg.Message, "Fehler!", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Error); } } } private string GetDeviceName(string Identifier) { string deviceName = ""; switch (Identifier) { case "13": deviceName = BrickMaster.DEVICE_DISPLAY_NAME.ToString(); break; case "17": deviceName = BrickRED.DEVICE_DISPLAY_NAME.ToString(); break; case "26": deviceName = BrickletDualRelay.DEVICE_DISPLAY_NAME.ToString(); break; case "27": deviceName = BrickletHumidity.DEVICE_DISPLAY_NAME.ToString(); break; case "216": deviceName = BrickletTemperature.DEVICE_DISPLAY_NAME.ToString(); break; case "217": deviceName = BrickletTemperatureIR.DEVICE_DISPLAY_NAME.ToString(); break; case "221": deviceName = BrickletBarometer.DEVICE_DISPLAY_NAME.ToString(); break; case "226": deviceName = BrickletPTC.DEVICE_DISPLAY_NAME.ToString(); break; case "263": deviceName = BrickletOLED128x64.DEVICE_DISPLAY_NAME.ToString(); break; case "268": deviceName = BrickletRealTimeClock.DEVICE_DISPLAY_NAME.ToString(); break; } return deviceName; } Quote
techniker Posted October 31, 2016 at 09:02 AM Posted October 31, 2016 at 09:02 AM Hallo Ich habe ein ähnliches Verhalten bei meiner Implementierung beobachtet. Es tritt aber nur über eine TCP/IP Verbindung auf, wie auch bei dir. Weiter tritt es bei mir nur bei der ersten Verbindung auf, d.h. bei einer erneuten Abfrage werden die Master, Red, oder auch andere Bricks korrket einmal gelistet. Ich habe den Verdacht das es sich dabei um ein Problem im TCP/IP Protokoll handelt. Verbindets du mit WLAN? Weil bei mir tritt es auch nur im WLAN auf. Ev. werden dort im Protokoll noch andere Daten übertragen welche bei der ersten Verbdingung nicht richtig ausgewertet werden bzw. stören. Beste Grüsse Quote
CChris Posted October 31, 2016 at 09:54 AM Author Posted October 31, 2016 at 09:54 AM Ja, ist eine WLan Verbindung über einen angeschlossenen WLan USB-Stick. Dass sich meine Liste vervielfacht, wenn ich mein Programm laufen habe - und dann zusätzlich noch den BrickV verbinde, kommt vor - auch, wenn ich das CONNECTCB aus dem Bereich "Robuster Ansatz" mit einbaue... Aber hier habe ich NUR den Redbrick doppelt - und die o.g. Szenarien sind nicht vorhanden. Also BrickV ist nicht verbunden - und das ConnectCB aus Robuster Ansatz ist auch nicht in meinem Code mit drin. Quote
photron Posted November 2, 2016 at 09:06 AM Posted November 2, 2016 at 09:06 AM Du kannst mehrere Enumerate Callback mit IPConnection.ENUMERATION_TYPE_AVAILABLE für das gleiche Brick(let) bekommen. Jeder Aufruf der enumerate() Funktion führt zu so einem Callback. Das meint wirklich jeder Aufruf. Dein Programm bekommt diesen Callback auch, wenn z.B. der Brick Viewer beim Connect ein Enumerate auslöst. Du musst also in deinem Enumerate Callback anhand der UID schauen, ob du das Brick(let) schon in der Liste hast und wenn ja, es nicht noch ein zweites mal hinzufügen, sondern ggf. seine Informationen aktualisieren. Quote
CChris Posted November 2, 2016 at 11:47 AM Author Posted November 2, 2016 at 11:47 AM Hallo photron, Danke für die Info. Was mich an dieser Stelle ein wenig verwundert ist, dass ich eben nur das RED Brick doppelt gelistet bekomme, wenn die Verbindung über WLan aufgebaut wurde. Unabhängig, ob der BrickV läuft oder nicht, oder ob er Connected ist oder nicht. Wen ich z.b. den BrickV verbinde, während meine Anwendung läuft, Fan bekomme ich alle Bricks&Bricklets mehrfach angezeigt - das passt ja zu deiner Erklärung... Aber NUR der RedBrick? Und NUR bei Verbindung über WLan? Gibt es in diesem Fall etwas auf dem RED Brick, was durch das Enumerate zwei Antworten vom RED auslöst? Wie gesagt - BrickV spielt hier keine rolle aktuell - und sonst sind auch keine anderen Komponenten betroffen. Quote
techniker Posted December 5, 2016 at 08:42 PM Posted December 5, 2016 at 08:42 PM Also, ich hab da bei mir eine Lösung gefunden. Das Problem ist dass aus welchem Grund auch immer, der TCP Ausgangs Buffer Daten enthält sobald eine TCP Verbindung hergestellt wird. Darum mache ich ein Connect und Lese den Buffer, beim Lesen wird dieser gelöscht, anschliessend kann ich mit der Funktion 254 die einzelnen Module abfragen ohne doppelte Einträge zu bekommen. TCPClient.Connect; TCPClient.IOHandler.ReadBytes(rxBuf, -1, False); Beste Grüsse und viel Erfolg Quote
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.