Transférer des données

Les données transférées sont des listes d’octets, que l’on peut assimiler à des entiers non signés compris entre 0 et 255, ou des caractères ASCII si la valeur est comprise entre 32 et 127.

 

Le type Python des objets transférés est bytes, correspondant à un n-uplet d’octets.

On peut définir un bytes en littéral comme une chaîne de caractères ASCII préfixé par b : b'2.3' pour les caractères 2, point et 3.

Plus d’information partie suivante.

 

Pour la suite, on suppose que l’objet ser est associé à une connexion ouverte.

 

Envoyer des données vers la carte :

ser.write(b'10') # envoi les caractères 1 puis 0

ser.write(b'10\n') # envoi les caractères 1, 0 puis un retour à la ligne

 

Exemple pour transférer un flottant (idem pour un entier)

var = 10.3 # définition d’un flottant

b = bytes(str(var), 'utf8') # converti le flottant en chaîne de caractères, puis en n-uplet d’octets

ser.write(b) # envoi les caractères 1, 0, point puis 3

 

Lire des données de la carte :

b = ser.read() # lit un octet

b = ser.readline() # lit les octets jusqu’au caractère \n (valeur 10), inclus.

Pour .readline(), il est important que le paramètre timeout soit défini lors de l’ouverture du port afin de ne pas bloquer le programme si le caractère retour à la ligne n’est pas transféré.

 

b = ser.read_until(b'\n') # lit les octets jusqu’à '\n' inclus.

Equivalent à readline() ici. Mais on peut préciser un autre caractère de fin. S’arrête aussi après la valeur définie par timeout.

 

 

Exemples de code : envoyer des nombres et récupérer le double

Code Arduino

float data;

void setup() {

  Serial.begin(9600);

}

void loop() {

  if (Serial.available()>0) {

    data = Serial.parseFloat();

    Serial.read(); // supprime le caractère de fin

    Serial.println(data*2, 5); // 5 chiffres après la virgule

  }

}

 

Code Python 

from serial import Serial

 

try:

    ser = Serial('COM3', 9600, timeout=1)

except:

    if ser.is_open:

        ser.close()

    print('Port non ouvert')

 

txt = input("Valeur ?")

while ser.is_open and len(txt)>0:

    val = float(txt)

    b = bytes(str(val), 'utf8') # conversion flottant -> chaîne de caractères -> octets

    ser.write(b)

    ser.write(b'\n') # ajout d'une fin de ligne. N'importe quel caractère convient

 

    b = ser.readline() # lecture d'une ligne qui doit se terminer par \n

    val = float(b.decode()) # conversion octets -> chaîne de caractères -> flottant

    print(val)

 

    txt = input("Valeur ?")

ser.close()