Seite 1 von 2

Nutzung von mpusbapi.dll unter W10

Verfasst: 03.05.2024 08:29
von PIC18F2550
Kleines Verständnisproblem beim Übersetzen in Purebasic.

Code: Alles auswählen

;Public Declare Function MPUSBRead Lib "mpusbapi.dll " Alias "_MPUSBRead "           (ByVal handle As Integer  , ByVal pData As Integer  , ByVal dwLen As Integer, ByRef pLength As Integer, ByVal dwMilliseconds As Integer) As Integer
        CallCFunction(0, "_MPUSBWrite"                                               , handle.l                , *SendData               , 64                     , 64             , 100)
[08:29:29] Waiting for executable to start...
[08:29:29] Executable type: Windows - x86 (32bit, Unicode)
[08:29:29] Executable started.
[08:29:30] [ERROR] USBAll10_MCD.pb (Line: 62)
[08:29:30] [ERROR] Invalid memory access. (write error at address 64)
[08:29:38] The Program execution has finished.

Muss das alles in Variabeln Stehen?

Re: Nutzung von mpusbapi.dll unter W10

Verfasst: 03.05.2024 08:40
von Macros
Auf den ersten Blick sehe ich, dass die Länge pLength als ByRef übergeben wird.
Hier wird also ein Pointer zu einer Variable erwartet. Vermutlich schreibt die Funktion dann die Anzahl der tatsächlich gelesenen Bytes in die Variable.
Das führt dann auch zum IMA (Invalid Memory Access), da dein Programm auf Speicher an der Adresse 64 zugreifen will.

Re: Nutzung von mpusbapi.dll unter W10

Verfasst: 03.05.2024 09:25
von PIC18F2550

Code: Alles auswählen

        PokeB(*SendData+0,$50) : PokeB(*SendData+1,$01) : PokeB(*SendData+2,$00) : PokeB(*SendData+3,$00) : PokeB(*SendData+4,$00) : PokeB(*SendData+5,$00)
        Erg.l = CallCFunction(0, "_MPUSBWrite", handle.l, *SendData, lens.l, *lene, Mils.l)
        PrintN ("_MPUSBWrite          Hex : "+Hex(Erg.l))
OpenLibrary Hex : 1E0000
_MPUSBGetDLLVersion Hex : 6000000
_MPUSBGetDeviceCount Hex : 1
_MPUSBOpen Hex : 1E4
_MPUSBWrite Hex : 1
_MPUSBWrite Hex : 1
_MPUSBClose Hex : 1
END

Jetzt geht es.
Danke.

Re: Nutzung von mpusbapi.dll unter W10

Verfasst: 03.05.2024 09:33
von mk-soft
Es geht auch ohne Peek und Poke

Code: Alles auswählen

; Strukture von Bytes mit unbekannter Größe

Structure ArrayOfByte ; -128 .. 127
  b.b[0] ; Größe 0 deaktiviert die Index Prüfung
EndStructure

Structure ArrayOfUByte ; 0 .. 255
  a.a[0] ; Größe 0 deaktiviert die Index Prüfung
EndStructure

Global *SendData.ArrayOfUByte

*SendData = AllocateMemory(2048)

*SendData\a[0] = $50
*SendData\a[1] = $01
*SendData\a[2] = $02
*SendData\a[3] = $0A
*SendData\a[4] = $00

; etc

Re: Nutzung von mpusbapi.dll unter W10

Verfasst: 04.05.2024 11:28
von PIC18F2550
Der übertragene Block ist im USBAll immer 16 Bytes groß. Der größte Block den der PIC18Fxxxx Übertragen kann ist 64 Bytes groß.

Code: Alles auswählen

SendData.a[64]

pSendData = *SendData[0]

Erg.l = CallCFunction(0, "_MPUSBWrite", handle.l, pSendData, lens.l, *lene, Mils.l)
Könnte das auch gehen?

Re: Nutzung von mpusbapi.dll unter W10

Verfasst: 04.05.2024 14:04
von DePe
Arrays mit eckigen Klammern können nur in Strukturen verwendet werden.
Die Adresse einer Variable erhält man mit '@'-Zeichen.
Das Sternchen gehört zur Variable und steht für den Datentyp 'Zeiger'. SendData() und *SendData() sind zwei unterschiedliche Variablen.
Verwende am Anfang des Codes 'EnableExplicit', dass hilft solche Fehler zu vermeiden.

Peter

Code: Alles auswählen

EnableExplicit
Dim SendData.a(63)
Define *pSendData
*pSendData = @SendData(0)

SendData(0) = 99
Debug PeekA(*pSendData)

Re: Nutzung von mpusbapi.dll unter W10

Verfasst: 04.05.2024 14:59
von PIC18F2550
Ok das werde ich mit merken.

So sollte es dann auch funktionieren.

EnableExplicit
Dim SendData.a(63)
Erg.l = CallCFunction(0, "_MPUSBWrite", handle.l, @SendData[0], lens.l, *lene, Mils.l)

Danke

Re: Nutzung von mpusbapi.dll unter W10

Verfasst: 05.05.2024 19:17
von PIC18F2550
So nach zwei Tage suche warum kein devicecout ausgegeben wurde habe ich das Problem gefunden.

Ich hatte die anzeige der Treiberversion herrausgenommen, großer Fehler.

Der original Treiber hat die Version 6.0.0.0.

Der falsche Treiber die Version 0.1.0.0.

Wo der herkommt ist schon eigenartig.

In dem zusammenhang wie Kann ich den Treiber in Mein Programm einlagern?
Geht das in einer mpusbapi_dll.a(64512) Variable? oder Besser?

Re: Nutzung von mpusbapi.dll unter W10

Verfasst: 06.05.2024 09:59
von DePe
Du kannst z.B. die DLL mit 'IncludeBinary' einbinden, und dann temporär speichern und verwenden.
Eventuell musst du bei den Compiler-Optionen 'Compile/Run' die Option für das Kompilieren im Quellverzeichnis aktivieren damit die DLL ohne Pfadangabe gefunden wird.

Peter

Code: Alles auswählen

EnableExplicit

#DllName = "mpusbapi.dll"
Define iFileNr.i, sFileName.s, iResult.i

sFileName = GetTemporaryDirectory() + #DllName
iFileNr = CreateFile(#PB_Any, sFileName)

If iFileNr
  iResult = WriteData(iFileNr, ?DllStart, ?DllEnd - ?DllStart)
  Debug "Bytes: " + iResult + " - Datei: " + sFileName

  CloseFile(iFileNr)
  DeleteFile(sFileName)
EndIf

DataSection
  DllStart:
  IncludeBinary #DllName
  DllEnd:

Re: Nutzung von mpusbapi.dll unter W10

Verfasst: 06.05.2024 12:47
von dige
Eine Dll kannst du auch direkt im Speicher einbinden. Das hatte glaub ich Rings mal im Rahmen der PBOSL Libs gepostet