UHF RFID Reader Writer SDK VBA to VB.NET Konvertierung

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Miri.

    UHF RFID Reader Writer SDK VBA to VB.NET Konvertierung

    Hallo zusammen,
    ich arbeite mich aktuell in die RFID Thematik ein und habe ein Testexemplar eines Lesegerätes/Schreibers vor mir. Der Hersteller liefert ein SDK mit. angeblich für vb.net jedoch ist die Doku auf VBA Basis.

    Daher habe ich die Doku mal versucht soweit mir möglich auf VB.net umzuschreiben jedoch hängt es aktuell an einer Fehlermeldung:

    Ursprungscode in VBA:

    VB.NET-Quellcode

    1. Public Type MW_EasyPod
    2. VID As Long
    3. PID As Long
    4. ReadTimeOut As Long
    5. WriteTimeOut As Long
    6. Handle As Long
    7. FeatureReportSize As Long
    8. InputReportSize As Long
    9. OutputReportSize As Long
    10. End Type
    11. Public Declare Function ConnectPodA Lib "EasyPod.DLL" Alias "ConnectPod" (ByRef m_EasyPod As MW_EasyPod, ByVal Index As Long) As Long
    12. Public Declare Function DisconnectPodA Lib "EasyPod.DLL" Alias "DisconnectPod" (ByRef m_EasyPod As MW_EasyPod) As Long
    13. Public Declare Function WriteDataA Lib "EasyPod.DLL" Alias "WriteData" (ByRef m_EasyPod As MW_EasyPod, lpString As Byte, ByVal lToWrite As Long, lWritten As Long) As Long
    14. Public Declare Function ReadDataA Lib "EasyPod.DLL" Alias "ReadData" (ByRef m_EasyPod As MW_EasyPod, lpString As Byte, ByVal lToRead As Long, lRead As Long) As Long
    15. Dim m_Pod As MW_EasyPod
    16. Private Sub Command1_Click()
    17. Dim lResult As Long
    18. Dim lReturn As Long
    19. Dim sOutput() As Byte
    20. Dim sInput() As Byte
    21. Dim i As Integer
    22. ReDim sOutput(20)
    23. ReDim sInput(20)
    24. For i = 0 To 19
    25. sOutput(i) = i
    26. Next
    27. im_Pod.VID = &HE6A
    28. m_Pod.PID = &H317
    29. lResult = ConnectPod(m_Pod, 1)
    30. lResult = ClearPODBuffer(m_Pod)
    31. If (lResult = 0) Then
    32. m_Pod.ReadTimeOut = 1000
    33. m_Pod.WriteTimeOut = 1000
    34. lResult = WriteData(m_Pod, sOutput(0), CLng(20), lReturn)
    35. lResult = ReadData(m_Pod, sInput(0), 20, lReturn)
    36. End If
    37. lReturn = DisconnectPod(m_Pod)
    38. End Sub


    Konvertiert in:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Public Structure MW_EasyPod
    3. Dim VID As Long
    4. Dim PID As Long
    5. Dim ReadTimeOut As Long
    6. Dim WriteTimeOut As Long
    7. Dim Handle As Long
    8. Dim FeatureReportSize As Long
    9. Dim InputReportSize As Long
    10. Dim OutputReportSize As Long
    11. End Structure
    12. Public Declare Function ConnectPodA Lib "EasyPod.DLL" Alias "ConnectPod" (ByRef m_EasyPod As MW_EasyPOD, ByVal Index As Long) As Long
    13. Public Declare Function DisconnectPodA Lib "EasyPod.DLL" Alias "DisconnectPod" (ByRef m_EasyPod As MW_EasyPOD) As Long
    14. Public Declare Function WriteDataA Lib "EasyPod.DLL" Alias "WriteData" (ByRef m_EasyPod As MW_EasyPOD, lpString As Byte, ByVal lToWrite As Long, lWritten As Long) As Long
    15. Public Declare Function ReadDataA Lib "EasyPod.DLL" Alias "ReadData" (ByRef m_EasyPod As MW_EasyPOD, lpString As Byte, ByVal lToRead As Long, lRead As Long) As Long
    16. Dim m_Pod As MW_EasyPOD
    17. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    18. Dim lResult As Long
    19. Dim lReturn As Long
    20. Dim sOutput() As Byte
    21. Dim sInput() As Byte
    22. Dim i As Integer
    23. ReDim sOutput(20)
    24. ReDim sInput(20)
    25. For i = 0 To 19
    26. sOutput(i) = i
    27. Next i
    28. m_Pod.VID = &HE6A
    29. m_Pod.PID = &H317
    30. lResult = ConnectPOD(m_Pod, 1)
    31. lResult = ClearPODBuffer(m_Pod)
    32. If (lResult = 0) Then
    33. m_Pod.ReadTimeOut = 1000
    34. m_Pod.WriteTimeOut = 1000
    35. lResult = WriteData(m_Pod, sOutput(0), CLng(20), lReturn)
    36. lResult = ReadData(m_Pod, sInput(0), 20, lReturn)
    37. End If
    38. lReturn = DisconnectPOD(m_Pod)
    39. End Sub
    40. End Class


    Fehlercode:

    BC30311Der Wert vom Typ "Form1.MW_EasyPod" kann nicht in "EasyPOD.MW_EasyPOD" konvertiert werden.

    Dieser Fehler tritt für jedes

    VB.NET-Quellcode

    1. m_Pod
    in den Zeilen 42,43 & 48-53 auf.

    Wie muss ich denn das korrekt von VBA in vb.net wandeln?



    Vielen Dank für Eure Hilfe! ^^

    Grüße
    Miri

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

    Hi,

    also ich bekomme diesen Fehler nicht. Aber in der Zeile lResult = ClearPODBuffer(m_Pod) bei deinem Code. Diese Funktion ist nicht deklariert.

    Ausserdem sieht mir das nach VB6 aus und nicht VBA. Schau mal hier, da ist das in VB.net:
    support.danbit.dk/R/RFID-MRW-U…plication Guide V0100.pdf
    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „NoIde“ ()

    @Miri Wenn da in VBA ein Long steht, wird das in VB.NET ein Integer (32 Bit).
    Long ist in .NET 64 Bit breit.
    Insbesondere die Struktur solltest Du Dir ansehen, und dann ggf. jede Deklaration einzeln testen.
    Sieh auch mal hier rein, wie ByRef-Strukturen übergeben werden können: Austausch von Daten zwischen einer VB.NET-exe und einer C-DLL, 32 und 64 Bit
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Eierlein schrieb:

    Alle Integer in Short umbenennen.
    Das ist nicht sinnvoll, zumal es hier explizit um die Deklaration von DLL-Routinen geht..
    Integer war (einst) als Prozessorbreite definiert mit der Aussage Breite(Integer) <= Breite(Long).
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Guten Morgen zusammen,

    Danke für eure Antworten. ^^

    Ich hab den Code nun soweit, dass keine Fehlermeldungen mehr vom Code selbst generiert werden.
    Jedoch habe ich mich an der SDK Anleitung des Herstellers orientiert und bekomme trotzdem keine Rückmeldung die ich vom RFID Leser erwarte.

    Wenn ich die Abfrage seitens SDK Beispiel stelle, bekomme ich vom Reader die Antwort: "CALL_READ_DATA_TIMEOUT = &HE0000008

    Beispiel der SDK:

    Visual Basic-Quellcode

    1. Dim sRequest As Byte() = {&H2, &H2, &H1, &H1}
    Leider habe ich keine Ahnung was diese Abfrage ausgeben soll.

    Lt. dem Mitgelieferten Testtool des Herstellers wird zur Abfrage des Tag's folgende Hex Befehl gesendet: 02 41 52 31 2C 30 2C 41 was entsprechend eine Antwort zurück liefert.

    Wenn ich dies als sRequest Array deklariere:

    VB.NET-Quellcode

    1. Dim sRequest as Byte() = {&H2, &H41, &H52, &H31, &H2C, &H30, &H2C, &H41}


    Wirft es mir eine Unbehandelte Ausnahme bei

    VB.NET-Quellcode

    1. lResult = ReadData(m_Pod, sResponse(0), 20, lReturn)
    mit dem Hinweis:

    System.AccessViolationException
    HResult=0x80004003
    Nachricht = Es wurde versucht, im geschützten Speicher zu lesen oder zu schreiben. Dies ist häufig ein Hinweis darauf, dass anderer Speicher beschädigt ist.
    Quelle = <Die Ausnahmequelle kann nicht ausgewertet werden.>
    Stapelüberwachung:
    <Die Ausnahmestapelüberwachung kann nicht ausgewertet werden.>



    VB.NET-Quellcode

    1. Public Class Form1
    2. ''###
    3. Const USER_DEFINE_ERROR = &HE0000000
    4. Const INSUFFICIENT_MOMORY_AVAILABLE = &HE0000001
    5. Const HIDD_GETATTRIBUTES_FAIL = &HE0000002
    6. Const CANNOT_FINDE_THE_DEVICE_SPECIFIED = &HE0000003
    7. Const SEND_DEVICE_CHECKCODE_FAIL = &HE0000004
    8. Const GET_DEVICE_CHECKCODE_FAIL = &HE0000005
    9. Const CHECK_DEVICE_CHECKCODE_FAIL = &HE0000006
    10. Const CALL_WRITE_DATA_TIMEOUT = &HE0000007
    11. Const CALL_READ_DATA_TIMEOUT = &HE0000008
    12. Const ALLOCATE_DEVICE_QUEUE_FAIL = &HE0000009
    13. Const GET_INPUT_REPORT_SIZE_FAIL = &HE000000A
    14. Const DELETE_INPUT_QUEUE_FAIL = &HE000000B
    15. Public Structure MW_EasyPOD
    16. Public VID As Integer
    17. Public PID As Integer
    18. Public ReadTimeOut As Integer
    19. Public WriteTimeOut As Integer
    20. Public Handle As Integer ' Do not modify this value, reserved for DLL
    21. Public FeatureReportSize As Integer ' Do not modify this value, reserved for DLL
    22. Public InputReportSize As Integer ' Do not modify this value, reserved for DLL
    23. Public OutputReportSize As Integer ' Do not modify this value, reserved for DLL
    24. End Structure
    25. '####
    26. Public Declare Function ConnectPOD Lib "EasyPOD.DLL" (ByRef m_EasyPod As MW_EasyPod, ByVal Index As Integer) As Integer
    27. Public Declare Function DisconnectPOD Lib "EasyPOD.DLL" (ByRef m_EasyPod As MW_EasyPod) As Integer
    28. Public Declare Function WriteData Lib "EasyPOD.DLL" (ByRef m_EasyPod As MW_EasyPod, ByRef lpString As Byte, ByVal lToWrite As Integer, ByRef lWritten As Integer) As Integer
    29. Public Declare Function ReadData Lib "EasyPOD.DLL" (ByRef m_EasyPod As MW_EasyPod, ByReflpString As Byte, ByVal lToRead As Integer, ByRef lRead As Integer) As Integer
    30. Public Declare Function ClearPODBuffer Lib "EasyPOD.DLL" (ByRef m_EasyPod As MW_EasyPod) As Integer
    31. Dim m_Pod As MW_EasyPod
    32. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    33. 'BEISPIEL ABFRAGE SDK
    34. 'Dim sRequest As Byte() = {&H2, &H2, &H1, &H1} '{STX, LEN, CMD, DATA1, DATA2.....}
    35. 'Abfrage gemäß Testtool des Herstellers
    36. Dim sRequest as Byte() = {&H2, &H41, &H52, &H31, &H2C, &H30, &H2C, &H41}
    37. Dim sResponse() As Byte
    38. ReDim sResponse(20)
    39. Dim reqLen As Integer = sRequest.Length
    40. Dim lResult As Integer
    41. Dim lReturn As Integer
    42. m_Pod.VID = &HE6A
    43. m_Pod.PID = &H317
    44. lResult = ConnectPOD(m_Pod, 1)
    45. TextBox1.Text = lResult.ToString("X8") 'Convert byte to HEX
    46. lResult = ClearPODBuffer(m_Pod)
    47. TextBox2.Text = lResult.ToString("X8") 'Convert byte to HEX
    48. If (lResult <> 0) Then 'Check the connectioin status
    49. MsgBox("Not connected yet", 16)
    50. Else
    51. m_Pod.ReadTimeOut = 200
    52. m_Pod.WriteTimeOut = 200
    53. lResult = WriteData(m_Pod, sRequest(0), CLng(reqLen), lReturn)
    54. TextBox3.Text = lResult.ToString("X8") 'Convert byte to HEX
    55.  
    56. lResult = ReadData(m_Pod, sResponse(0), 20, lReturn)
    57. TextBox4.Text = lResult.ToString("X8") 'Convert byte to HEX
    58. End If
    59. lReturn = DisconnectPOD(m_Pod)
    60. TextBox5.Text = lResult.ToString("X8") 'Convert byte to HEX
    61. End Sub
    62. End Class


    kann mir hier jemand weiterhelfen? :?:

    Herzlichen Dank.

    Miri