import serial import time import sys import re parameter = sys.argv[1:] # Exclude the script name #print("Parameters received:") port='/dev/'+parameter[0] def read_cairsens(port, baudrate=9600, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, databits=serial.EIGHTBITS, timeout=1): """ Lit les données de la sonde CAIRSENS via UART. /usr/bin/python3 /var/www/nebuleair_pro_4g/envea/read_ref.py ttyAMA4 :param port: Le port série utilisé (ex: 'COM1' ou '/dev/ttyAMA0'). :param baudrate: Le débit en bauds (ex: 9600). :param parity: Le bit de parité (serial.PARITY_NONE, serial.PARITY_EVEN, serial.PARITY_ODD). :param stopbits: Le nombre de bits de stop (serial.STOPBITS_ONE, serial.STOPBITS_TWO). :param databits: Le nombre de bits de données (serial.FIVEBITS, serial.SIXBITS, serial.SEVENBITS, serial.EIGHTBITS). :param timeout: Temps d'attente maximal pour la lecture (en secondes). :return: Les données reçues sous forme de chaîne de caractères. """ try: # Ouvrir la connexion série ser = serial.Serial( port=port, baudrate=baudrate, parity=parity, stopbits=stopbits, bytesize=databits, timeout=timeout ) print(f"Connexion ouverte sur {port} à {baudrate} bauds.") # Attendre un instant pour stabiliser la connexion time.sleep(2) # Envoyer une commande à la sonde (si nécessaire) # Adapter cette ligne selon la documentation de la sonde #ser.write(b'\r\n') ser.write(b'\xFF\x02\x13\x30\x01\x02\x03\x04\x05\x06\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x1C\xD1\x61\x03') # Lire les données reçues #data = ser.read_until(b'\n') # Lire jusqu'à la fin de ligne ou un autre délimiteur data = ser.readline() print(f"Données reçues brutes : {data}") #print(f"Données reçues (utf-8) : {data.decode('utf-8').strip()}") # Convertir les données en hexadécimal hex_data = data.hex() # Convertit en chaîne hexadécimale formatted_hex = ' '.join(hex_data[i:i+2] for i in range(0, len(hex_data), 2)) # Formate avec des espaces print(f"Données reçues en hexadécimal : {formatted_hex}") # Extraire les valeurs de l'index 11 à 18 extracted_hex = hex_data[20:36] # Chaque caractère hex est représenté par 2 caractères print(f"Valeurs hexadécimales extraites (11 à 18) : {extracted_hex}") # Convertir en ASCII et en valeurs numériques raw_bytes = bytes.fromhex(extracted_hex) # ASCII characters ascii_data = ''.join(chr(b) if 0x20 <= b <= 0x7E else '.' for b in raw_bytes) sensor_type = "Unknown" # ou None, selon ton besoin sensor_measurement = "Unknown" sensor_range = "Unknown" letters = re.findall(r'[A-Za-z]', ascii_data) if len(letters) >= 1: #print(f"First letter found: {letters[0]}") if letters[0] == "C": sensor_type = "Cairclip" if len(letters) >= 2: #print(f"Second letter found: {letters[1]}") if letters[1] == "A": sensor_measurement = "Ammonia(NH3)" if letters[1] == "C": sensor_measurement = "O3 and NO2" if letters[1] == "G": sensor_measurement = "CH4" if letters[1] == "H": sensor_measurement = "H2S" if letters[1] == "N": sensor_measurement = "NO2" if len(letters) >= 3: #print(f"Thrisd letter found: {letters[2]}") if letters[2] == "B": sensor_range = "0-250 ppb" if letters[2] == "M": sensor_range = "0-1ppm" if letters[2] == "V": sensor_range = "0-20 ppm" if letters[2] == "P": sensor_range = "PACKET data block ?" if len(letters) < 1: print("No letter found in the ASCII data.") print(f"Valeurs converties en ASCII : {sensor_type} {sensor_measurement} {sensor_range}") #print(f"Sensor type: {sensor_type}") #print(f"Sensor measurment: {sensor_measurement}") #print(f"Sensor range: {sensor_range}") # Numeric values numeric_values = [b for b in raw_bytes] print(f"Valeurs numériques : {numeric_values}") # Fermer la connexion ser.close() print("Connexion fermée.") return data except serial.SerialException as e: print(f"Erreur de connexion série : {e}") return None # Exemple d'utilisation if __name__ == "__main__": port = port # Remplacez par votre port série (ex: /dev/ttyAMA0 sur Raspberry Pi) baudrate = 9600 # Débit en bauds (à vérifier dans la documentation) parity = serial.PARITY_NONE # Parité (NONE, EVEN, ODD) stopbits = serial.STOPBITS_ONE # Bits de stop (ONE, TWO) databits = serial.EIGHTBITS # Bits de données (FIVEBITS, SIXBITS, SEVENBITS, EIGHTBITS) data = read_cairsens(port, baudrate, parity, stopbits, databits) if data: print(f"Mesures de la sonde : {data}")