Lire des infos sur un système FTDI (ftd2xx) : ex. Teleinfo

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Golfy
Messages : 423
Inscription : mer. 25/août/2004 15:14
Localisation : Grenoble
Contact :

Lire des infos sur un système FTDI (ftd2xx) : ex. Teleinfo

Message par Golfy »

Bonsoir,

j'ai fait ça avec les pieds, et il doit *vraiment* avoir moyen d'améliorer la lecture (mais je fais planter le programme si j'essaye plus de 1 car.).
Pour info, CarteElectronic (http://www.cartelectronic.com/) propose un système qui se connecte en USB sur un PC (ils ont aussi d'autres produits en ZigBee, etc) et permet de lire 2 compteurs EDF : pratique pour lire la consommation et la production.

Le système est basé sur un composant FTDI (http://www.ftdichip.com/Support/Documen ... 00071).pdf)

Mon code est largement inspiré d'un programmeur Purebasic allemand (http://forums.purebasic.com/german/view ... hp?t=16814)

Ceci étant, il est exploitable pour aller plus loin (et voir s'afficher les données du compteur) :roll:

Code : Tout sélectionner

#FT_OK = 0

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

#FT_BITS_8 = 8
#FT_BITS_7 = 7

#FT_STOP_BITS_1 = 0
#FT_STOP_BITS_2 = 2

#FT_PARITY_NONE = 0
#FT_PARITY_ODD = 1
#FT_PARITY_EVEN = 2
#FT_PARITY_MARK = 3
#FT_PARITY_SPACE = 4

#FT_FLOW_NONE = $0000
#FT_FLOW_RTS_CTS = $0100
#FT_FLOW_DTR_DSR = $0200
#FT_FLOW_XON_XOFF = $0400

#FT_BAUD_9600 = 9600
#FT_BAUD_19200 = 19200

#FT_EVENT_RXCHAR = 1
#FT_EVENT_MODEM_STATUS = 2

*Bin  = AllocateMemory(2048)
*Bout = AllocateMemory(2048)

Declare.s Hexa2(*B, longueur.i)
Declare.s Str2(*B,longueur.i)
Declare Lireserie()

If OpenLibrary(0, "FTD2XX.dll")   ; ouverture de la DLL (mise dans répertoire local)
  Debug "dll introuvable!"
  
  ; la DLL permet de trouver la fonction par son nom : ici "Interface USB --> Compteur"
  If #FT_OK = CallFunction(0, "FT_OpenEx", @"Interface USB -> Compteur", #FT_OPEN_BY_DESCRIPTION , @hdev)
    Debug "FT232RL trouvé"
    
    ; Si la fonction existe, on peut l'accéder par un port classique COM... le numéro est donné ci-après !
    If #FT_OK = CallFunction(0, "FT_GetComPortNumber", hdev, @port)
      Debug "Port COM"+Str(port)
    Else
      Debug "Error FT_GetComPortNumber"
    EndIf

    
    If #FT_OK = CallFunction(0,"FT_SetBitMode", hdev, $11, $20) ; compteur 1
      ; CallFunction(0,"FT_SetBitMode', hdev, $22, $20) compteur 2
      ; CallFunction(0,"FT_SetBitMode', hdev, $00, $20) aucun compteur
      d = ElapsedMilliseconds()
      RX=0
      TX=0
      Event=0
      mot$=""
      Repeat
      ; FT_GetStatus indique si des octets sont présents en lecture ou écriture (IN/OUT)
      If #FT_OK = CallFunction(0, "FT_GetStatus", hdev, @RX, @TX, @event)
        If RX > 0
          ; Si c'est le cas, on lit les données (à placer dans un BUFFER)
          If #FT_OK = CallFunction(0, "FT_Read", hdev, @*Bin, 1, @le)
            a$ = Chr(*Bin & $FF)
            If a$ = Chr(#CR)
              Debug mot$
              Debug "-------------------"
              mot$ = ""
            ElseIf a$ = Chr(#LF)
              Debug mot$
              mot$ = ""             
            Else
              If Asc(a$)<32
                mot$ = mot$ + "("+Str(Asc(a$))+")"
              Else
                mot$ = mot$ + a$
              EndIf
           EndIf
           
           EndIf
         EndIf
       EndIf
       Until ElapsedMilliseconds()-d>5000
    EndIf
      
  EndIf
EndIf
CloseLibrary(0)
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/