2016-06-29 1 views
0

J'expérimente l'écriture de scripts GNUradio en python. Mon but éventuel est d'avoir une routine qui écrit périodiquement un résultat à virgule flottante depuis un processus GNUradio vers le port série. Dans un premier temps, je voulais simplement marquer une pause une simple routine Le code suivant joue un 1kHz à travers la carte son:Interruption d'un flux GNUradio simple

`#!/usr/bin/env python 
################################################## 
# Gnuradio Python Flow Graph 
# Title: simpleTone 
# Generated: Wed Jun 29 07:26:02 2016 
################################################## 

from gnuradio import analog 
from gnuradio import audio 
from gnuradio import blocks 
from gnuradio import gr 
import time 

class simpleTone(gr.top_block): 

    def __init__(self): 
    gr.top_block.__init__(self) 

     ################################################## 
     # Variables 
     ################################################## 
     self.samp_rate = samp_rate = 32000 

     ################################################## 
     # Blocks 
     ################################################## 
     self.blocks_throttle_0 = blocks.throttle(gr.sizeof_float*1, samp_rate) 
     self.audio_sink_0 = audio.sink(samp_rate, "", True) 
     self.analog_sig_source_x_0 = analog.sig_source_f(samp_rate, analog.GR_COS_WAVE, 1000, 1, 0) 

     ################################################## 
     # Connections 
     ################################################## 
     self.connect((self.analog_sig_source_x_0, 0), (self.blocks_throttle_0, 0)) 
     self.connect((self.blocks_throttle_0, 0), (self.audio_sink_0, 0)) 


if __name__ == '__main__': 
    simpleTone().run()` 

Le code ci-dessus fonctionne très bien, à l'exception de quelques dépassements et en cliquant dans l'audio. Toutefois, si je fais la substitution suivante:

`   
if __name__ == '__main__': 
    simpleTone().start() 
    time.sleep(3) 
    simpleTone().stop()` 

Le résultat est que l'exécution du fichier, et ne se termine au bout de 3 secondes, mais pas de son est produit.

Je suis sûr que j'ai raté quelque chose de simple, toute aide serait appréciée. Merci.

-Ed

+0

Enlevez la manette des gaz. Vous devriez même être averti que c'est une mauvaise idée d'utiliser un bloc d'accélérateur dans un graphique de flux avec un matériel de limitation de débit réel! ** N'utilisez jamais la manette des gaz ensemble avec les éviers et les sources de matériel! ** –

+0

Merci pour cette suggestion Marcus. Je pensais que l'utilisation d'un accélérateur était toujours «sûre» :) Supprimer le bloc d'accélérateur a résolu les problèmes de débordement/audio lors de l'exécution du programme. Le problème avec essayer de démarrer/dormir/arrêter le processus reste toujours. –

Répondre

0

Cette question a été également posé ici:

http://lists.gnu.org/archive/html/discuss-gnuradio

et a répondu. Je vais partager cette réponse ici au cas où quelqu'un vient à travers cette question:

Votre problème est que vous construisez trois blocs supérieurs non reliés: vous avez trois occurrences distinctes de « simpleTone() ». vous au lieu de créer un besoin et continuer à l'utiliser, comme ceci:

tb = simpleTone() 
tb.start() 
... 
tb.stop() 

Vous avez un autre problème, aussi, que vous trouverez après la fixation du premier. .wait() signifie attendre que le diagramme de flux termine tous les traitements , et que votre organigramme ne comporte aucun élément pour terminer tel qu'un bloc Head, de sorte que .stop() ne sera jamais atteint.

Au lieu de cela, vous devez procéder comme ceci:

tb = simpleTone() 
tb.start() 
# the flowgraph is now running independently 
time.sleep(3) 
tb.stop() 
tb.wait() 

Le .wait final() n'est pas vraiment nécessaire dans ce cas - ce qu'il fait est attendre le flowgraph pour terminer, ce qui va se passer prochainement après l'appel de .stop(), mais si vous souhaitez à nouveau démarrer le même bloc supérieur , vous devez avoir appelé .wait() avant d'appeler .start(), afin de toujours avoir un ensemble correspondant de [démarrer , stop, wait] ou [start, wait, stop] est une bonne pratique.

0

Ceci est un problème avec la façon dont vous mettez en caisse des objets en python. Chaque fois que vous appelez 'simpleTone()', vous lancez un nouvel objet. de la classe simpleTone. Je suis d'accord avec la réponse précédente que la création d'un objet permettra de résoudre le problème.