Page 1 of 1

Impossible d'écouter un port ttyUSB0

Posted: Fri Apr 24, 2020 12:45 pm
by broush
Bonjour,

Je suis sur un Raspberry 3B sous Buster et je suis entrain de réaliser un projet. Grâce à un Lidar (je possède le TFmini de Benewake) et deux servomoteurs (SG90) je dois scanner l'environnement . Lorsque j'initialise le programme en python (version 3.7) le lidar fonctionne bien et me renvois des données de distance et de force du signal comme montre ce code:

Code: Select all

# -*- coding: utf-8 -*
import serial
import time

ser = serial.Serial("/dev/ttyUSB0", 115200)

def getTFminiData():
    while True:
        time.sleep(0.1)
        count = ser.in_waiting
        if count > 8:
            recv = ser.read(9)  
            ser.reset_input_buffer()  
            # type(recv), 'str' in python2(recv[0] = 'Y'), 'bytes' in python3(recv[0] = 89)
            # type(recv[0]), 'str' in python2, 'int' in python3 
            
            if recv[0] == 0x59 and recv[1] == 0x59:     #python3
                distance = recv[2] + recv[3] * 256
                strength = recv[4] + recv[5] * 256
                print('(', distance, ',', strength, ')')
                ser.reset_input_buffer()
                
            #if recv[0] == 'Y' and recv[1] == 'Y':     #python2
            #    lowD = int(recv[2].encode('hex'), 16)      
            #    highD = int(recv[3].encode('hex'), 16)
            #    lowS = int(recv[4].encode('hex'), 16)      
            #    highS = int(recv[5].encode('hex'), 16)
            #    distance = lowD + highD * 256
            #    strength = lowS + highS * 256
            #    print(distance, strength)
                
            
            # you can also distinguish python2 and python3: 
            #import sys
            #sys.version[0] == '2'    #True, python2
            #sys.version[0] == '3'    #True, python3


if __name__ == '__main__':
    try:
        if ser.is_open == False:
            ser.open()
        getTFminiData()
    except KeyboardInterrupt:   # Ctrl+C
        if ser != None:
            ser.close()

Ensuite dans un autre fenêtre je lance le programme pour écouter le lidar, récupérer les données et les transformer en coordonnées x; y; z pour que je puisse ensuite obtenir un nuage de points sous matplotlib, voici le code:

Code: Select all

import serial
import math
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np

ser = serial.Serial('/dev/ttyUSB0', 115200, timeout=1)
xlist = []
ylist = []
zlist = []
phi = 0

while phi <= math.pi:

    data = ser.readline()
    print(data)

    if len(data) is 11:
        theta = ""
        phi = ""
        dist = ""
        for i in range(3):
            theta += data[i]
        for i in range(3, 6):
            phi += data[i]
        for i in range(6, 10):
            dist += data[i]

        theta = int(theta) * math.pi / 180
        phi = int(phi) * math.pi / 180
        dist = int(dist)

        x = dist * math.sin(phi) * math.cos(theta)
        y = dist * math.sin(phi) * math.sin(theta)
        z = dist * math.cos(phi)

        xlist.append(x)
        ylist.append(y)
        zlist.append(z)

('      \n'
 'print (xlist)\n'
 'print \n'
 'print ylist\n'
 'print\n'
 'print zlist\n'
 'print\n')

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
plt.xlim((-300, 300))
plt.ylim((-300, 300))

ax.scatter(xlist, ylist, zlist)
plt.show()

Et c'est là que ça bloque, après avoir lancé le programmé de récupération de données, le programme tfmini s'arrête et j'obtiens un message d'erreur suivant:

Traceback (most recent call last):
File "tfmini_23.py", line 43, in <module>
getTFminiData()
File "tfmini_23.py", line 12, in getTFminiData
recv = ser.read(9)
File "/usr/local/lib/python3.7/dist-packages/serial/serialposix.py", line 509, in read
raise SerialException('read failed: {}'.format(e))
serial.serialutil.SerialException: read failed: device reports readiness to read but returned no data (device disconnected or multiple access on port?)

J'ai fait pleins de recherche sur le net, ça fait deux jours que j'essaye de résoudre ce problème. Actuellement le TFmini est branché via usb à travers un TTL, le FT262RL mais j'ai déjà testé en passant directement par le uart sur les pins 8&10 et j'avais exactement le même problème. Je n'arrive à écouter aucun port. J'ai effectué également des changements comme précisé sur cette page https://roboticsbackend.com/raspberry-p ... rmissions/ donc niveau permissions et la désactivation du bt je suis bon.

Après ça vient peut-être de la compatibilité entre python 2 et 3? J'ai essayé pleins de solutions avant de venir poster ici. J'ai également suivi de simples tutos pour écrire un programme en python pour écrire d'un côté sur un port et de lire avec un autre programme de l'autre et j'obtenais le même message d'erreur.

Une autre piste, peut-être le temps de fermeture et d'ouverture du port?

Je précise que je ne suis pas un expert et je découvre le raspberry et python donc peut-être que la réponse va vous paraître évidente, mais pas à moi ^^

Sans résoudre ce problème d'écoute, je ne pourrais pas avancer dans mon projet. Avez-vous des idées?
Avez-vous une idée du problème?

Re: Impossible d'écouter un port ttyUSB0

Posted: Fri Apr 24, 2020 12:59 pm
by broush
Peut-être réunir les deux programmes en un? Pour ne pas avoir à accéder au même port simultanément?

Cela je ne sais pas trop comment faire, si quelqu'un a une idée, je suis preneur.

Re: Impossible d'écouter un port ttyUSB0

Posted: Fri Apr 24, 2020 5:06 pm
by JumpZero
Bjr,
tu ne peux pas avoir 2 programmes qui utilisent en même temps un port série!
Le premier qui l'utilise pose un lock dessus qui empeche les autres de l'utiliser.
C'est normal imagine le bazar si deux programmes dialoguent en même temps sur la même ressource.
C'est ce que te dis Python

Code: Select all

multiple access on port?)
Donc tu l'as compris tu mets le tout dans un seul programme. A toi de bosser un peu Python pour comprendre ce qu'il faut faire. Si tu as vraiment besoin de 2 programmes tu peux les faire communiquer de manière simple: le premier écrit dans un fichier que lit le second. (Et pour être au top tu utilises un pipe)
--
Bonsoir

Re: Impossible d'écouter un port ttyUSB0

Posted: Sun Apr 26, 2020 7:31 am
by broush
Bonjour,

Merci beaucoup pour ta réponse, du coup en effet je suis entrain de réunir les deux programmes. Par ailleurs, je vais également tester la deuxième méthode avec écriture dans un fichier et lecture du celui-ci. Petite question à ce sujet, il n'y aura pas un soucis d'accès au fichier en simultané comme sur les ports? Et le pipe c'est un genre de tunnel entre les deux programme pour qu'ils s'échangent des infos?

Je vais regarder tout ça et merci pour le "tuyau" ;)