Jump to content

Recommended Posts

Posted

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;
}

tf_01.png.e703f142cdaefdd53b4c3bbc890a3f8e.png

tf_02.png.0f0a4c7b6020895dfd5ba681ca7c2baa.png

Posted

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 

Posted

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.

Posted

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.

Posted

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.

 

 

  • 1 month later...
Posted

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

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...