2017-08-22 3 views
0

J'ai donc écrit un code sur Python pour mon échelle connectée à mon ordinateur via un port RS232. Maintenant, je suis partie travailler avec le code suivant:python a scindé une chaîne d'octets

import serial 

while True: 
    ser = serial.Serial('COM2', 9600, timeout = 1) 
    print(ser.name) 
    ser.write(b'w') 
    line = ser.readline() 
    print(line) 
    ser.close() 

Chaque fois que j'envoie « w » en octets à l'échelle, il renvoie la valeur. Cela ressemble à ceci:

COM2 
b'  0.000 kg \r\n' 

Il imprime d'abord le nom du port COM et sur la ligne suivante les données reçues. Toutefois. Je veux isoler la valeur (chiffres) comme un int.

J'ai essayé d'utiliser:

line = ser.readline()[:-6] 
int(line) 

Cela se débarrasse de tous les junk "kg \ r \ n". Et nous laisse avec seulement les chiffres. Mais bien sûr, Python ne me permettra pas de changer une chaîne d'octets en un entier. C'est probablement une question stupide pour les débutants, tout comme mes deux autres posts, mais s'il vous plait, gardez-moi, je n'ai codé que depuis 2 semaines maintenant.

+0

Vous pouvez consulter le (https [module 'struct']: //docs.python .org/3/library/struct.html) –

Répondre

0

Vous avez supposé que vous deviez convertir (c'est-à-dire décoder) les octets renvoyés par une lecture binaire série dans une chaîne, que vous pouvez ensuite analyser. En utilisant bytes.decode("ascii") devrait faire ici (pas de caractères étranges à vue).

Puis, convertir en flotteur, et non int. De plus, en utilisant str.split est plus robuste aux changements si vous savez que le premier champ est votre valeur:

>>> line = b'  0.000 kg \r\n' 
>>> value = float(line.split()[0].decode("ascii")) 

résultats dans 0.0

+0

Ça a marché! Donc vous devez le décoder pour le convertir. J'ai dû le modifier un peu car parfois la balance envoie une ligne vide quand la valeur mesurée n'est pas stable. Cela conduirait à une erreur. –