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()