c# & can - DeviceIoControl

  • why not using the unsafe


    example


  • The problem is not the pointer itself, it is the layout of the data structures that differs from C#.NET to C.Win32. Pointers can always be generated by using ref or out function arguments. But bringing the structures into correct order is more difficult.


    Regards,


    H. Keller

    F&S Elektronik Systeme GmbH
    As this is an international forum, please try to post in English.
    Da dies ein internationales Forum ist, bitten wir darum, Beiträge möglichst in Englisch zu verfassen.

  • Hallo!


    Wie zurückzukommen auf die CAN Properties, wie groß muss das uint Array sein, aus welchem ich die Informationen in die eigene Datenstruktur lese? Muss das Array initialisiert sein?


    Danke, MfG

  • Das ist doch einfach rauszukriegen: einfach so lange mit verschieden langen Arrays aufrufen, bis kein Fehler mehr zurückgegeben wird.


    Aber ich muss nochmal fragen, warum Sie die Klasse nicht einfach kaufen. Sie machen nun schon wochenlang daran herum, finanziell hat sich das für Sie garantiert nicht rentiert. Die momentane Klasse bekommen Sie doch sogar im Quelltext, d.h. das Verständnis wäre gegeben. Und anpassen müssen Sie die Klasse eigentlich nicht. Sie müssen ja auch nicht den Ethernet-Treiber anpassen, wenn Sie eine Ethernet-Applikation schreiben wollen. Nein, Sie müssen einfach eine Applikation schreiben, die diese Klasse verwendet. Und wenn Ihnen die Klasse so noch nicht gefällt, dann leiten Sie die Klasse ab und erzeugen eine eigene, genehmere Klasse.


    Mit freundlichen Grüßen,


    H. Keller

    F&S Elektronik Systeme GmbH
    As this is an international forum, please try to post in English.
    Da dies ein internationales Forum ist, bitten wir darum, Beiträge möglichst in Englisch zu verfassen.

  • Quote

    Das ist doch einfach rauszukriegen: einfach so lange mit verschieden langen Arrays aufrufen, bis kein Fehler mehr zurückgegeben wird.


    Haben Sie wenigst einen ungefähren Anhaltspunkt in welchem Bereich? Testweise hab ich dies bereits gemacht - aber erfolglos (bis ca. 128),
    auch wenn ich die Größe zu groß festlege, ist das Array leer.


    Quote

    Aber ich muss nochmal fragen, warum Sie die Klasse nicht einfach kaufen.


    Das stand zur Alternative, nicht meine Entscheidung. Davon abgesehen, habe ich mich seit Wochen mit dem Thema nicht mehr beschäftigt.


    PS: Ist die CAN Implementierung auf der NetDCU10 gleich zur NetDCU8?


    edit:


    mit dem Methodenkopf bzw.:

    Code
    1. UInt32[] tmpA = new UInt32[i];
    2. rvalue = DeviceIoControlProperties(hPort, CANElements.IOCTL_CAN_READ_PROPERTIES, 0, 0, out tmpA, Marshal.SizeOf(tmpA), out ReturnedBytes, IntPtr.Zero);


    war bis 1024 nicht erfolgreich

  • Quote from "all-finder"
    Code
    1. UInt32[] tmpA = new UInt32[i];
    2. rvalue = DeviceIoControlProperties(hPort, CANElements.IOCTL_CAN_READ_PROPERTIES, 0, 0, out tmpA, Marshal.SizeOf(tmpA), out ReturnedBytes, IntPtr.Zero);


    war bis 1024 nicht erfolgreich


    Vermutlich weil Sie einen Denkfehler machen. Ein .NET-Array hat solange die Länge Null, bis Werte eingetragen werden. So haben Sie trotz unterschiedlich deklariertem Array dennoch mit Marshal.SizeOf(tmpA) immer den gleichen Längenwert an die Funktion übergeben, nämlich 0. Lassen Sie sich diesen Wert doch mal vor dem Aufruf ausgeben, und Sie werden sehen, dass sie eben *nicht* Werte bis 1024 durchprobiert haben.


    Der interne Code ist leider so geschrieben, dass die Anzahl genau passen muss. Das Array darf also auch zu groß sein.


    Dass ich Ihnen hier nicht einfach eine Zahl nenne, liegt daran, dass es nicht ganz leicht ist, diese Zahl zu ermitteln, da Sie auch in meinem Code relativ kompliziert berechnet wird. Da tauchen die Längen von Feldern und Enumerations auf, die Längen von Teilarrays werden dann aufsummiert, usw. Das alles ist nicht ganz so leicht nachzuvollziehen und zusammenzusuchen. Da erscheint es mir einfacher, dass Sie schnell eine Schleife programmieren und es kurz ausprobieren.


    Mit freundlichen Grüßen,


    H. Keller

    F&S Elektronik Systeme GmbH
    As this is an international forum, please try to post in English.
    Da dies ein internationales Forum ist, bitten wir darum, Beiträge möglichst in Englisch zu verfassen.