probleme lecture Eeprom FT230XS

Codes specifiques à Windows
ebelouet
Messages : 6
Inscription : dim. 04/janv./2026 19:21

probleme lecture Eeprom FT230XS

Message par ebelouet »

BOnjour,

Je cherche à savoir pourquoi j ai une erreur 6 dans ce code pour lire l'eeprom du composant FT230X :

Code : Tout sélectionner

 
; ===============================================
; Communication FT230XS via DLL FTDI (FTD2XX.dll)
; Avec gestion EEPROM
; ===============================================

; Constantes FTDI
#FT_OK = 0
#FT_INVALID_HANDLE = 1
#FT_DEVICE_NOT_FOUND = 2
#FT_DEVICE_NOT_OPENED = 3
#FT_IO_ERROR = 4
#FT_INSUFFICIENT_RESOURCES = 5
#FT_INVALID_PARAMETER = 6

#FT_OPEN_BY_SERIAL_NUMBER = 1
#FT_OPEN_BY_DESCRIPTION = 2
#FT_OPEN_BY_LOCATION = 4

#FT_BAUD_9600 = 9600
#FT_BAUD_115200 = 115200

#FT_BITS_8 = 8
#FT_STOP_BITS_1 = 0
#FT_PARITY_NONE = 0

; Variables globales
Global ftHandle.i = 0
Global LibraireFTDI.i

; Structure pour informations du périphérique
Structure FT_DEVICE_LIST_INFO_NODE
  Flags.l
  Type.l
  ID.l
  LocId.l
  SerialNumber.s{16}
  Description.s{64}
  ftHandle.i
EndStructure

; Structure EEPROM pour FT230X
Structure FT_EEPROM_230X
  Common_Signature1.l      ; Header - must be 0x00000000
  Common_Signature2.l      ; Header - must be 0xFFFFFFFF
  Common_Version.l         ; Version
  VendorId.w               ; 0x0403 = FTDI VID
  ProductId.w              ; 0x6015 = FT230X PID
  Manufacturer.i           ; Pointer to Manufacturer string
  ManufacturerId.i         ; Pointer to ManufacturerId string
  Description.i            ; Pointer to Description string
  SerialNumber.i           ; Pointer to SerialNumber string
  MaxPower.w               ; Max power consumption (mA)
  PnP.w                    ; Plug and Play
  SelfPowered.w            ; Self powered
  RemoteWakeup.w           ; Remote wakeup
  
  ; FT230X specific
  Cbus0.a                  ; CBUS0 configuration
  Cbus1.a                  ; CBUS1 configuration
  Cbus2.a                  ; CBUS2 configuration
  Cbus3.a                  ; CBUS3 configuration
  
  RIsD2XX.a                ; RI is D2XX
  
  Common_SerNum.a          ; Use serial number
  Common_InvertTXD.a       ; Invert TXD
  Common_InvertRXD.a       ; Invert RXD
  Common_InvertRTS.a       ; Invert RTS
  Common_InvertCTS.a       ; Invert CTS
  Common_InvertDTR.a       ; Invert DTR
  Common_InvertDSR.a       ; Invert DSR
  Common_InvertDCD.a       ; Invert DCD
  Common_InvertRI.a        ; Invert RI
EndStructure

; ===============================================
; Chargement de la DLL FTDI
; ===============================================
Procedure ChargerDLL()
  LibraireFTDI = OpenLibrary(#PB_Any, "FTD2XX.dll")
  
  If LibraireFTDI
    Debug "DLL FTD2XX.dll chargée avec succès"
    ProcedureReturn #True
  Else
    Debug "ERREUR: Impossible de charger FTD2XX.dll"
    Debug "Assurez-vous que la DLL est dans le même dossier ou dans System32"
    ProcedureReturn #False
  EndIf
EndProcedure

; ===============================================
; Prototypes des fonctions FTDI
; ===============================================
PrototypeC FT_CreateDeviceInfoList(*lpdwNumDevs)
PrototypeC FT_GetDeviceInfoList(*pDest, *lpdwNumDevs)
PrototypeC FT_Open(deviceNumber, *pHandle)
PrototypeC FT_OpenEx(*pArg1, Flags, *pHandle)
PrototypeC FT_Close(ftHandle)
PrototypeC FT_Read(ftHandle, *lpBuffer, dwBytesToRead, *lpBytesReturned)
PrototypeC FT_Write(ftHandle, *lpBuffer, dwBytesToWrite, *lpBytesWritten)
PrototypeC FT_SetBaudRate(ftHandle, BaudRate)
PrototypeC FT_SetDataCharacteristics(ftHandle, WordLength, StopBits, Parity)
PrototypeC FT_SetTimeouts(ftHandle, ReadTimeout, WriteTimeout)
PrototypeC FT_Purge(ftHandle, Mask)
PrototypeC FT_GetQueueStatus(ftHandle, *dwRxBytes)
PrototypeC FT_EEPROM_Read(ftHandle, *eepromData, eepromDataSize, *Manufacturer, *ManufacturerId, *Description, *SerialNumber)
PrototypeC FT_EEPROM_Program(ftHandle, *eepromData, eepromDataSize, *Manufacturer, *ManufacturerId, *Description, *SerialNumber)

; ===============================================
; Lister les périphériques FTDI
; ===============================================
Procedure ListerPeripheriques()
  Protected numDevs.l = 0
  Protected status.l
  Protected i.i
  
  If Not LibraireFTDI
    Debug "DLL non chargée"
    ProcedureReturn 0
  EndIf
  
  Protected FT_CreateDeviceInfoList.FT_CreateDeviceInfoList = GetFunction(LibraireFTDI, "FT_CreateDeviceInfoList")
  
  If FT_CreateDeviceInfoList
    status = FT_CreateDeviceInfoList(@numDevs)
    
    If status = #FT_OK
      Debug "Nombre de périphériques FTDI: " + Str(numDevs)
      ProcedureReturn numDevs
    Else
      Debug "Erreur lors de la liste des périphériques: " + Str(status)
      ProcedureReturn 0
    EndIf
  EndIf
  
  ProcedureReturn 0
EndProcedure

; ===============================================
; Ouvrir le périphérique
; ===============================================
Procedure OuvrirPeripherique(deviceIndex.i = 0)
  Protected status.l
  Protected FT_Open.FT_Open
  Protected FT_SetBaudRate.FT_SetBaudRate
  Protected FT_SetDataCharacteristics.FT_SetDataCharacteristics
  Protected FT_SetTimeouts.FT_SetTimeouts
  Protected FT_Purge.FT_Purge
  
  If Not LibraireFTDI
    Debug "DLL non chargée"
    ProcedureReturn #False
  EndIf
  
  FT_Open = GetFunction(LibraireFTDI, "FT_Open")
  
  If FT_Open
    status = FT_Open(deviceIndex, @ftHandle)
    
    If status = #FT_OK And ftHandle <> 0
      Debug "Périphérique " + Str(deviceIndex) + " ouvert (Handle: " + Str(ftHandle) + ")"
      
      ; Configuration du port série
      FT_SetBaudRate = GetFunction(LibraireFTDI, "FT_SetBaudRate")
      FT_SetDataCharacteristics = GetFunction(LibraireFTDI, "FT_SetDataCharacteristics")
      FT_SetTimeouts = GetFunction(LibraireFTDI, "FT_SetTimeouts")
      FT_Purge = GetFunction(LibraireFTDI, "FT_Purge")
      
      If FT_SetBaudRate
        FT_SetBaudRate(ftHandle, #FT_BAUD_9600)
      EndIf
      
      If FT_SetDataCharacteristics
        FT_SetDataCharacteristics(ftHandle, #FT_BITS_8, #FT_STOP_BITS_1, #FT_PARITY_NONE)
      EndIf
      
      If FT_SetTimeouts
        FT_SetTimeouts(ftHandle, 1000, 1000) ; 1 seconde
      EndIf
      
      If FT_Purge
        FT_Purge(ftHandle, 3) ; RX + TX
      EndIf
      
      Debug "Configuration: 9600 bauds, 8N1"
      ProcedureReturn #True
    Else
      Debug "ERREUR: Impossible d'ouvrir le périphérique (Status: " + Str(status) + ")"
      ProcedureReturn #False
    EndIf
  EndIf
  
  ProcedureReturn #False
EndProcedure

; ===============================================
; Écrire des données
; ===============================================
Procedure EcrireDonnees(*Buffer, Taille.i)
  Protected bytesWritten.l = 0
  Protected status.l
  Protected FT_Write.FT_Write
  
  If ftHandle = 0
    Debug "Périphérique non ouvert"
    ProcedureReturn #False
  EndIf
  
  FT_Write = GetFunction(LibraireFTDI, "FT_Write")
  
  If FT_Write
    status = FT_Write(ftHandle, *Buffer, Taille, @bytesWritten)
    
    If status = #FT_OK
      Debug "Écrit: " + Str(bytesWritten) + " octets"
      ProcedureReturn bytesWritten
    Else
      Debug "Erreur d'écriture: " + Str(status)
      ProcedureReturn 0
    EndIf
  EndIf
  
  ProcedureReturn 0
EndProcedure

; ===============================================
; Écrire du texte
; ===============================================
Procedure EcrireTexte(Texte.s)
  Protected *Buffer = UTF8(Texte)
  Protected Taille.i = StringByteLength(Texte, #PB_UTF8)
  Protected Resultat.i
  
  Resultat = EcrireDonnees(*Buffer, Taille)
  FreeMemory(*Buffer)
  
  ProcedureReturn Resultat
EndProcedure

; ===============================================
; Lire des données
; ===============================================
Procedure LireDonnees(*Buffer, TailleMax.i)
  Protected bytesRead.l = 0
  Protected rxBytes.l = 0
  Protected status.l
  Protected FT_GetQueueStatus.FT_GetQueueStatus
  Protected FT_Read.FT_Read
  
  If ftHandle = 0
    Debug "Périphérique non ouvert"
    ProcedureReturn 0
  EndIf
  
  FT_GetQueueStatus = GetFunction(LibraireFTDI, "FT_GetQueueStatus")
  FT_Read = GetFunction(LibraireFTDI, "FT_Read")
  
  If FT_GetQueueStatus
    status = FT_GetQueueStatus(ftHandle, @rxBytes)
    
    If status = #FT_OK And rxBytes > 0
      If rxBytes > TailleMax
        rxBytes = TailleMax
      EndIf
      
      If FT_Read
        status = FT_Read(ftHandle, *Buffer, rxBytes, @bytesRead)
        
        If status = #FT_OK
          Debug "Lu: " + Str(bytesRead) + " octets"
          ProcedureReturn bytesRead
        EndIf
      EndIf
    EndIf
  EndIf
  
  ProcedureReturn 0
EndProcedure

; ===============================================
; Lire l'EEPROM
; ===============================================
Procedure LireEEPROM(*eepromData.FT_EEPROM_230X)
  Protected status.l
  Protected FT_EEPROM_Read.FT_EEPROM_Read
  Protected Manufacturer.s{64}
  Protected ManufacturerId.s{64}
  Protected Description.s{64}
  Protected SerialNumber.s{64}
  
  If ftHandle = 0
    Debug "Périphérique non ouvert"
    ProcedureReturn #False
  EndIf
  
  FT_EEPROM_Read = GetFunction(LibraireFTDI, "FT_EEPROM_Read")
  
  If FT_EEPROM_Read
    ; Initialiser la structure
    *eepromData\Common_Signature1 = 0
    *eepromData\Common_Signature2 = $FFFFFFFF
    *eepromData\Common_Version = 0
    
    status = FT_EEPROM_Read(ftHandle, *eepromData, SizeOf(FT_EEPROM_230X), 
                            @Manufacturer, @ManufacturerId, @Description, @SerialNumber)
    
    If status = #FT_OK
      Debug "=== Lecture EEPROM réussie ==="
      Debug "Fabricant: " + PeekS(@Manufacturer, -1, #PB_Ascii)
      Debug "Description: " + PeekS(@Description, -1, #PB_Ascii)
      Debug "Numéro de série: " + PeekS(@SerialNumber, -1, #PB_Ascii)
      Debug "VID: 0x" + Hex(*eepromData\VendorId, #PB_Word)
      Debug "PID: 0x" + Hex(*eepromData\ProductId, #PB_Word)
      Debug "Max Power: " + Str(*eepromData\MaxPower) + " mA"
      ProcedureReturn #True
    Else
      Debug "ERREUR lecture EEPROM: " + Str(status)
      ProcedureReturn #False
    EndIf
  EndIf
  
  ProcedureReturn #False
EndProcedure

; ===============================================
; Écrire dans l'EEPROM
; ===============================================
Procedure EcrireEEPROM(Manufacturer.s, Description.s, SerialNumber.s, MaxPower.w = 90)
  Protected status.l
  Protected FT_EEPROM_Program.FT_EEPROM_Program
  Protected eepromData.FT_EEPROM_230X
  
  If ftHandle = 0
    Debug "Périphérique non ouvert"
    ProcedureReturn #False
  EndIf
  
  FT_EEPROM_Program = GetFunction(LibraireFTDI, "FT_EEPROM_Program")
  
  If FT_EEPROM_Program
    ; Initialiser la structure EEPROM
    eepromData\Common_Signature1 = 0
    eepromData\Common_Signature2 = $FFFFFFFF
    eepromData\Common_Version = 0
    
    eepromData\VendorId = $0403        ; FTDI VID
    eepromData\ProductId = $6015       ; FT230X PID
    eepromData\MaxPower = MaxPower
    eepromData\SelfPowered = 0
    eepromData\RemoteWakeup = 0
    
    ; Configuration CBUS (exemple)
    eepromData\Cbus0 = 0  ; TxLED
    eepromData\Cbus1 = 0  ; RxLED
    eepromData\Cbus2 = 0  ; TxRxLED
    eepromData\Cbus3 = 0  ; PWREN#
    
    eepromData\Common_SerNum = 1      ; Utiliser le numéro de série
    
    Debug "=== Écriture EEPROM ==="
    Debug "Fabricant: " + Manufacturer
    Debug "Description: " + Description
    Debug "Numéro de série: " + SerialNumber
    Debug "Max Power: " + Str(MaxPower) + " mA"
    
    Protected *Manuf = UTF8(Manufacturer)
    Protected *Desc = UTF8(Description)
    Protected *Serial = UTF8(SerialNumber)
    
    status = FT_EEPROM_Program(ftHandle, @eepromData, SizeOf(FT_EEPROM_230X),
                               *Manuf, 0, *Desc, *Serial)
    
    FreeMemory(*Manuf)
    FreeMemory(*Desc)
    FreeMemory(*Serial)
    
    If status = #FT_OK
      Debug "EEPROM programmée avec succès!"
      Debug "ATTENTION: Débranchez et rebranchez le périphérique pour appliquer les changements"
      ProcedureReturn #True
    Else
      Debug "ERREUR programmation EEPROM: " + Str(status)
      ProcedureReturn #False
    EndIf
  EndIf
  
  ProcedureReturn #False
EndProcedure

; ===============================================
; Fermer le périphérique
; ===============================================
Procedure FermerPeripherique()
  Protected FT_Close.FT_Close
  
  If ftHandle <> 0
    FT_Close = GetFunction(LibraireFTDI, "FT_Close")
    
    If FT_Close
      FT_Close(ftHandle)
      Debug "Périphérique fermé"
    EndIf
    
    ftHandle = 0
  EndIf
EndProcedure

; ===============================================
; Programme principal - Exemples
; ===============================================

Debug "=== Test FT230XS avec DLL FTDI ==="
Debug ""

; Charger la DLL
If ChargerDLL()
  
  ; Lister les périphériques
  Define numDevices.i = ListerPeripheriques()
  
  If numDevices > 0
    Debug ""
    
    ; Ouvrir le premier périphérique
    If OuvrirPeripherique(0)
      
      ; Exemple 1: Lire l'EEPROM
      Debug ""
      Debug "=== Test 1: Lecture EEPROM ==="
      Define eeprom.FT_EEPROM_230X
      LireEEPROM(@eeprom)
      
      ; Exemple 2: Écrire dans l'EEPROM (DÉCOMMENTER AVEC PRÉCAUTION!)
      ; Debug ""
      ; Debug "=== Test 2: Écriture EEPROM ==="
      ; EcrireEEPROM("Mon Fabricant", "Mon FT230XS", "SN12345678", 90)
      
     Debug "=== Test 2: Écriture EEPROM ==="
      EcrireEEPROM("Mon Fabricant", "Mon FT230XS", "SN12345678", 90)
      ; Exemple 3: Communication série
      Debug ""
      Debug "=== Test 3: Communication série ==="
      EcrireTexte("Hello FT230XS!")
      
      Delay(100)
      
      Dim Buffer.a(255)
      Define bytesLus.i = LireDonnees(@Buffer(), 255)
      
      If bytesLus > 0
        Debug "Données reçues:"
        For i = 0 To bytesLus - 1
          Debug "  [" + Str(i) + "] = 0x" + Hex(Buffer(i), #PB_Byte)
        Next
      EndIf
      
      ; Fermer
      Debug ""
      FermerPeripherique()
    EndIf
  Else
    Debug "Aucun périphérique FTDI détecté"
  EndIf
  
  CloseLibrary(LibraireFTDI)
Else
  Debug "Impossible de continuer sans la DLL"
EndIf

Debug ""
Debug "Programme terminé - Appuyez sur Entrée"
Input()
Merci d avance
Eric
Dernière modification par ebelouet le lun. 05/janv./2026 20:41, modifié 2 fois.
Bruce33
Messages : 17
Inscription : dim. 10/sept./2023 14:02

Re: probleme lecture Eeprom FT230XS

Message par Bruce33 »

Bonjour,
Est-ce que ça veut dire que vous avez le message "ERREUR lecture EEPROM: 6" dans la fenêtre de débogage ?
D'après votre code :

Code : Tout sélectionner

#FT_INVALID_PARAMETER = 6
l'erreur 6 signifie qu'au moins un des paramètres utilisés pour appeler la fonction FT_EEPROM_Read est incorrect.
A partir de quoi avez-vous réalisé ce code ?
ebelouet
Messages : 6
Inscription : dim. 04/janv./2026 19:21

Re: probleme lecture Eeprom FT230XS

Message par ebelouet »

BOnsoir,
C est un code que j ai trouvé sur le net .
Bruce33
Messages : 17
Inscription : dim. 10/sept./2023 14:02

Re: probleme lecture Eeprom FT230XS

Message par Bruce33 »

Vous avez trouvé ce code tel quel, en PureBasic ??

Quelle est la version du fichier FTD2XX.dll utilisé ?
Je me demande s'il ne faudrait pas utiliser Prototype plutôt que PrototypeC pour déclarer les fonctions.
J'ai aussi l'impression que votre structure FT_EEPROM_230X n'est pas correcte, en tous cas avec la dernière version de la librairie FTD2XX.dll.

Votre code essaie aussi d'écrire dans l'EEPROM, cela me semble risqué pour le moment.
ebelouet
Messages : 6
Inscription : dim. 04/janv./2026 19:21

Re: probleme lecture Eeprom FT230XS

Message par ebelouet »

BOnsoir,

J ai utilisé l Ia claude, car je nai pas les compétences pour écrire ce code.

Cordialement
Bruce33
Messages : 17
Inscription : dim. 10/sept./2023 14:02

Re: probleme lecture Eeprom FT230XS

Message par Bruce33 »

Je ne suis pas surpris et c'est bien de le reconnaître...
Mais je n'ai pas l'intention de faire le SAV de Claude.
L'IA avec ses bots est la plaie d'Internet et des forums.
Utilisez l'IA comme aide pour être plus efficace dans ce que vous savez faire.
Mais si vous l'utilisez pour réaliser des choses que vous ne comprenez pas, vous prenez des risques !
Quel est votre objectif ?
Le fabricant FTDI fournit des outils et des exemples de programmes avec le code source (en plusieurs langages mais pas le PureBasic).
L'outil FT_PROG ne vous conviendrait-il pas ?
ebelouet
Messages : 6
Inscription : dim. 04/janv./2026 19:21

Re: probleme lecture Eeprom FT230XS

Message par ebelouet »

BOnjour,

Oui je connais ftprog, mais j ai besoin de mémoriser les infotmations dans une base de données.
Cordialement
Avatar de l’utilisateur
falsam
Messages : 7353
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: probleme lecture Eeprom FT230XS

Message par falsam »

ebelouet a écrit : ven. 09/janv./2026 15:05 j ai besoin de mémoriser les infotmations dans une base de données.
Tu pourrais utiliser SQlite

Discussion sur :
ce lien viewtopic.php?t=16597
ou
ce lien viewtopic.php?f=6&t=14224 pour un préambule.

Le premier lien est préférable pour la mise à jour des données.
Configuration : Windows 11 Famille 64-bit - PB 6.23 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
ebelouet
Messages : 6
Inscription : dim. 04/janv./2026 19:21

Re: probleme lecture Eeprom FT230XS

Message par ebelouet »

Merci mais le plus important pour le moment est la lire de l eeprom du FT230XS avant de faire l enregistrement dans la base de donnée.
Bruce33
Messages : 17
Inscription : dim. 10/sept./2023 14:02

Re: probleme lecture Eeprom FT230XS

Message par Bruce33 »

Je n'ai pas de matériel FTDI sous la main pour des tests dans l'immédiat.
J'aurai probablement un composant FT232R mais pas FT230XS.
Je ne promets rien mais je ferai un essai quand j'aurai le matériel et un peu de temps.
ebelouet
Messages : 6
Inscription : dim. 04/janv./2026 19:21

Re: probleme lecture Eeprom FT230XS

Message par ebelouet »

BOnjour,
La structure du tableau n est pas la meme, donc pas possible avec un FT232RL.
Cordialement
Bruce33
Messages : 17
Inscription : dim. 10/sept./2023 14:02

Re: probleme lecture Eeprom FT230XS

Message par Bruce33 »

Les données ne sont pas les mêmes mais la méthode doit l'être.
Quand je parviendrai à lire la puce FT232R avec PureBasic et la librairie FTD2XX.dll, j'aurai compris comment faire.
Répondre