Codeschnipsel von C++ nach VB übersetzen

  • VB.NET
  • .NET (FX) 4.0

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von jvbsl.

    Codeschnipsel von C++ nach VB übersetzen

    Moin, moin,

    für eine Motorsteuerung, die über RS232 angesprochen wird, habe ich leider nur ein Example in C. Hab jetzt fast alles mühsam übersetzt, scheitere aber an einem kleinen Abschnitt:

    C-Quellcode

    1. void SendCmd(HANDLE Handle, UCHAR Address, UCHAR Command, UCHAR Type, UCHAR Motor, INT Value)
    2. {
    3. UCHAR TxBuffer[9];
    4. DWORD BytesWritten;
    5. int i;
    6. TxBuffer[0]=Address;
    7. TxBuffer[1]=Command;
    8. TxBuffer[2]=Type;
    9. TxBuffer[3]=Motor;
    10. TxBuffer[4]=Value >> 24;
    11. TxBuffer[5]=Value >> 16;
    12. TxBuffer[6]=Value >> 8;
    13. TxBuffer[7]=Value & 0xff;
    14. TxBuffer[8]=0;
    15. for(i=0; i<8; i++)
    16. TxBuffer[8]+=TxBuffer[i];
    17. //Senden
    18. WriteFile(Handle, TxBuffer, 9, &BytesWritten, NULL);
    19. }


    Folgendes ist unklar:
    - Wie übersetze ich Zeile 1 - Dank fehlender Basics kann ich mit "HANDLE Handle" nichts anfangen ?(

    - Wofür dient in Zeile 20 das Vorzeichen & ?

    - Kann mir das jemand in VB übersetzen?

    Danke sagt vorab der Vielfrager


    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „vielfrager“ ()

    Müsste so passen (Nicht getestet):

    VB.NET-Quellcode

    1. <DllImport("kernel32.dll", SetlastError:=True)>
    2. Private Shared Function WriteFile(ByVal hFile As IntPtr, ByVal Buffer As IntPtr, ByVal nNumberOfBytesToWrite As Integer, ByRef lpNumberOfBytesWritten As Integer, ByRef lpOverlapped As OVERLAPPED) As <MarshalAs(UnmanagedType.Bool)> Boolean
    3. End Function
    4. Sub SendCmd(ByVal Handle As IntPtr, ByVal Address As Byte, ByVal Command As Byte, ByVal Type As Byte, ByVal Motor As Byte, ByVal Value As Integer)
    5. Dim TxBuffer(9) As Byte
    6. Dim BytesWritten As UInteger
    7. Dim i As Integer
    8. TxBuffer(0)=Address
    9. TxBuffer(1)=Command
    10. TxBuffer(2)=Type
    11. TxBuffer(3)=Motor
    12. TxBuffer(4)=Value >> 24
    13. TxBuffer(5)=Value >> 16
    14. TxBuffer(6)=Value >> 8
    15. TxBuffer(7)=Value And &HFF
    16. TxBuffer(8)=0
    17. For i = 0 To 7
    18. TxBuffer(8) += TxBuffer(i)
    19. Next
    20. WriteFile(Handle, TxBuffer, 9, BytesWritten, Nothing)
    21. End Sub



    Wofür dient in Zeile 20 das Vorzeichen &


    Pass by Reference (ByRef in Visual Basic). In C muss man aber explizit mit "&" (Adressoperator) angeben, dass das überreichte Argument by reference ist.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Quadsoft“ ()

    Handle ist wohl am besten mit IntPtr umsetzbar. Da soetwas meist eine Adresse einer Variable in einem Speicher ist, wäre diese Adresse allerdings abhängig von der Adressraumgröße am Ziel. Es könnte Short-, Integer- oder auch Long-Größe haben.
    DWORD ist normalerweise UInteger.
    Zeile 14: TxBuffer(7)=Value AND &Hff
    Zeile 20: Das & steht in C für "Adresse von", ist also ein Pointer oder auch Handle, also eine Adressangabe einer Variable.
    Spekulation: Du könntest es mit GCHandle.ToIntPtr(DeineVariable) versuchen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VaporiZed schrieb:


    Spekulation: Du könntest es mit GCHandle.ToIntPtr(DeineVariable) versuchen.


    Muss man nicht, das übernimmt P/Invoke. Daher schreibt man auch "ByRef" in die P/Invoke Deklaration
    Hi
    der Code von Quadsoft sollte eigentlich nicht kompilieren. Hast du Option Strict auf On?
    Zwei Punkte: Value ist vom Typ Integer, weshalb auch Value >> x und Value And 0xFF integer sind.
    Rechts-Shift bei Integer bedeutet für negative Zahlen, dass sie mit dem Vorzeichen-Bit aufgefüllt werden - also mit dem Bit an der höchsten Stelle. Das heißt, dass ein Überlauf auftreten sollte.
    Übrigens lässt sich das vermeiden, indem man auf UInteger zurückgreift. Das wird nicht arithmetisch, sondern logisch geshiftet.

    Viele Grüße
    ~blaze~
    Nur, dass du anstelle von WriteFile am besten das hier verwendest:
    msdn.microsoft.com/en-us/library/ms143551(v=vs.110).aspx

    du brauchst auch das ganze open zeugs nicht, weil du direkt die SerialPort klasse dafür verwenden wirst.
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---