Nutzung von mpusbapi.dll unter W10

Hardware- und Elektronikbasteleien, Ansteuerung von Schnittstellen und Peripherie.
Fragen zu "Consumer"-Problemen kommen in Offtopic.
Benutzeravatar
PIC18F2550
Beiträge: 104
Registriert: 29.04.2024 09:10
Computerausstattung: Server HP Proliant G7
PC AMD FX(tm)-9590, 64Gb Ram, 2x 2TB Raid5 SAS

Nutzung von mpusbapi.dll unter W10

Beitrag 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?
Barbarus hic ergo sum, quia non intellegor ulli.
Ein Barbar bin ich hier, da ich von keinem verstanden werde.
ʎɐqǝ ıǝq ɹnʇɐʇsɐʇ ǝuıǝ ɹǝpǝıʍ ǝıu ǝɟnɐʞ ɥɔı ´uuɐɯ ɥo
Benutzeravatar
Macros
Beiträge: 1361
Registriert: 23.12.2005 15:00
Wohnort: Olching(bei FFB)
Kontaktdaten:

Re: Nutzung von mpusbapi.dll unter W10

Beitrag 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.
Bild
Benutzeravatar
PIC18F2550
Beiträge: 104
Registriert: 29.04.2024 09:10
Computerausstattung: Server HP Proliant G7
PC AMD FX(tm)-9590, 64Gb Ram, 2x 2TB Raid5 SAS

Re: Nutzung von mpusbapi.dll unter W10

Beitrag 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.
Barbarus hic ergo sum, quia non intellegor ulli.
Ein Barbar bin ich hier, da ich von keinem verstanden werde.
ʎɐqǝ ıǝq ɹnʇɐʇsɐʇ ǝuıǝ ɹǝpǝıʍ ǝıu ǝɟnɐʞ ɥɔı ´uuɐɯ ɥo
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Nutzung von mpusbapi.dll unter W10

Beitrag 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
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
PIC18F2550
Beiträge: 104
Registriert: 29.04.2024 09:10
Computerausstattung: Server HP Proliant G7
PC AMD FX(tm)-9590, 64Gb Ram, 2x 2TB Raid5 SAS

Re: Nutzung von mpusbapi.dll unter W10

Beitrag 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?
DePe
Beiträge: 194
Registriert: 26.11.2017 16:17

Re: Nutzung von mpusbapi.dll unter W10

Beitrag 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)
Benutzeravatar
PIC18F2550
Beiträge: 104
Registriert: 29.04.2024 09:10
Computerausstattung: Server HP Proliant G7
PC AMD FX(tm)-9590, 64Gb Ram, 2x 2TB Raid5 SAS

Re: Nutzung von mpusbapi.dll unter W10

Beitrag 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
Barbarus hic ergo sum, quia non intellegor ulli.
Ein Barbar bin ich hier, da ich von keinem verstanden werde.
ʎɐqǝ ıǝq ɹnʇɐʇsɐʇ ǝuıǝ ɹǝpǝıʍ ǝıu ǝɟnɐʞ ɥɔı ´uuɐɯ ɥo
Benutzeravatar
PIC18F2550
Beiträge: 104
Registriert: 29.04.2024 09:10
Computerausstattung: Server HP Proliant G7
PC AMD FX(tm)-9590, 64Gb Ram, 2x 2TB Raid5 SAS

Re: Nutzung von mpusbapi.dll unter W10

Beitrag 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?
Barbarus hic ergo sum, quia non intellegor ulli.
Ein Barbar bin ich hier, da ich von keinem verstanden werde.
ʎɐqǝ ıǝq ɹnʇɐʇsɐʇ ǝuıǝ ɹǝpǝıʍ ǝıu ǝɟnɐʞ ɥɔı ´uuɐɯ ɥo
DePe
Beiträge: 194
Registriert: 26.11.2017 16:17

Re: Nutzung von mpusbapi.dll unter W10

Beitrag 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:
Benutzeravatar
dige
Beiträge: 1239
Registriert: 08.09.2004 08:53

Re: Nutzung von mpusbapi.dll unter W10

Beitrag von dige »

Eine Dll kannst du auch direkt im Speicher einbinden. Das hatte glaub ich Rings mal im Rahmen der PBOSL Libs gepostet
"Papa, ich laufe schneller - dann ist es nicht so weit."
Antworten