I requested a python script from AI for my Fluke45 and it wrote this and works well.
import time
import datetime
import serial
import pandas as pd
# CONFIGURATION
SERIAL_PORT = "COM3" # À modifier selon votre Gestionnaire de périphériques
OUTPUT_FILE = "mesures_fluke45.xlsx"
INTERVALLE = 1.0
# Dictionnaire des commandes directes natives du Fluke 45
MODES_DISPONIBLES = {
"1": ("VDC", "Tension Continue (Volt DC)"),
"2": ("VAC", "Tension Alternative (Volt AC)"),
"3": ("OHMS", "Résistance (Ohms)"),
"4": ("FREQ", "Fréquence (Hz)"),
"5": ("ADC", "Courant Continu (Ampère DC)"),
"6": ("AAC", "Courant Alternatif (Ampère AC)"),
"7": ("DIODE", "Test de Diode"),
"8": ("CONT", "Test de Continuité")
}
print("--- SÉLECTION DU MODE DE MESURE ---")
for touche, (code, description) in MODES_DISPONIBLES.items():
print(f"[{touche}] {description}")
choix = input("Entrez le numéro du mode choisi : ").strip()
if choix in MODES_DISPONIBLES:
cmd_mode = MODES_DISPONIBLES[choix][0]
nom_mode = MODES_DISPONIBLES[choix][1]
else:
print("Choix invalide. Mode par défaut : Volt DC")
cmd_mode = "VDC"
nom_mode = "Tension Continue (Volt DC)"
liste_donnees = []
try:
# Initialisation avec gestion stricte des flux
ser = serial.Serial(
port=SERIAL_PORT,
baudrate=9600,
bytesize=serial.EIGHTBITS,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
timeout=1,
xonxoff=True # Indispensable pour le Fluke 45
)
def vider_tampon():
"""Vide les caractères résiduels ou l'écho renvoyé par l'appareil."""
time.sleep(0.1)
if ser.in_waiting:
ser.read(ser.in_waiting)
def piloter_appareil(commande):
"""Envoie une commande de configuration sans attendre de valeur de mesure."""
vider_tampon()
# On teste la commande directe brute (ex: VDC\r\n) qui est la plus fiable
ser.write(f"{commande}\r\n".encode("ascii"))
time.sleep(0.5) # Pause cruciale pour laisser les relais physiques commuter
vider_tampon()
def requete_mesure():
"""Demande spécifiquement la valeur sur l'afficheur principal."""
vider_tampon()
ser.write(b"VAL1?\r\n")
time.sleep(0.1)
# Lecture de la réponse de l'appareil
reponse = ser.readline().decode("ascii").strip()
# Nettoyage si l'appareil est en mode écho ou renvoie les invites =>
reponse = reponse.replace("=>", "").replace("?>", "").strip()
return reponse
print(f"\nConfiguration de l'appareil sur : {nom_mode}...")
piloter_appareil(cmd_mode) # Envoi direct de la fonction (ex: "VDC" ou "OHMS")
piloter_appareil("AUTO") # Forcer le calibre automatique
print("\n--- Enregistrement démarré (Appuyez sur Ctrl+C pour arrêter et enregistrer) ---")
while True:
horodatage = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
lecture = requete_mesure()
# Si la chaîne contient des données valides (exclure les lignes vides)
if lecture and not lecture.startswith("VAL1"):
print(f"[{horodatage}] [{cmd_mode}] Valeur : {lecture}")
liste_donnees.append({
"Date et Heure": horodatage,
"Mode": nom_mode,
"Mesure brute": lecture
})
time.sleep(INTERVALLE)
except serial.SerialException as e:
print(f"\nErreur de connexion port série : {e}")
print("Vérifiez le numéro du port COM dans le Gestionnaire de périphériques.")
except KeyboardInterrupt:
print("\nMesures interrompues par l'utilisateur.")
finally:
if liste_donnees:
print("Génération du fichier Excel...")
df = pd.DataFrame(liste_donnees)
df.to_excel(OUTPUT_FILE, index=False)
print(f"✅ Fichier '{OUTPUT_FILE}' enregistré avec {len(liste_donnees)} lignes.")
else:
print("Aucune donnée enregistrée.")
if 'ser' in locals() and ser.is_open:
ser.close()
print("Port série fermé.")