2017-07-26 4 views
0

Je veux contrôler un synthétiseur de fréquence avec un appareil distant utilisant Python 2.7.Je ne peux pas obtenir de sortie USB d'un autre appareil en utilisant paramiko

La communication directement à l'aide d'un port USB à partir d'un Rapberry Pi se fait via le terminal. Les commandes se trouvent dans le manuel. Il existe deux types de commandes, définir et obtenir, par exemple:

echo 0E > /dev/ttyACM0 # 0E is the code to reset 
echo 04 > /dev/ttyACM0|head</dev/ttyACM0 # 04 will return the frequency 

J'utilise le code suivant pour obtenir la sortie en python sur ma framboise:

print(os.popen(echo 04 > /dev/ttyACM0|head</dev/ttyACM0)) 

La commande Terminal peut être exécutée en utilisant ssh d'un autre appareil. Maintenant, lorsque j'essaie d'utiliser Python, je peux utiliser des commandes set sans probelms, mais obtenir des commandes n'apportera pas la bonne sortie.

J'utilise la fonction suivante:

import paramiko 
ssh = paramiko.SSHClient() 
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
global Con # nected 
con=0 


     def SSHConnection(): 
      global con 
      while True: 
       try: 
        ssh.connect(IP,username=User,password=Password) 
        con=1 
        break 
       except: 
        tkMessageBox.showwarning("Error!", "Device not found or wrong Login") 
        break 

     def outin(command): 
      global con 
      output="sudo echo "+command+"> /dev/ttyACM0|head</dev/ttyACM0" 
      if remote.get()==0: # switches between remote and direct output 
       answer=os.popen(output).readlines() 
      else: 
       if con==0: # checks wether a connection has already 
        SSHConnection() # connects 
       else: 
        pass 
       stdin,stdout,stderr = ssh.exec_command(output) 
       answer=stdout.read() 
      return answer 

Je trouve en ligne que ma fonction peut faire l'.read() avant ma commande a été exécutée. Toutes les solutions que j'ai trouvées en ligne utilisaient la fonction channel.recv_exit_status(), ce qui m'a bloqué dans une boucle.

Je serais très heureux si quelqu'un pouvait m'aider.

Editer: La mauvaise sortie est en fait 0x0096 = 150 ce qui n'est pas faux, mais généralement la dernière requête que j'envoie.

Répondre

0

Le problème est une sorte de minutage. J'ai fait une solution de contournement en appelant un code python sur le périphérique distant pour enregistrer la sortie dans un fichier différent, puis appeler le fichier. Fonctionne dans environ 98% des appels ..