我有一个hackrf硬件单元,它将连续的原始uint8数据流提供给linux shell管道。
例如,这会将连续数据传输到linux shell中的另一个应用程序,如下所示:
(-(n/(f-n)))
阳离子)
在python中,这将做同样的事情:
hackrf_transfer -r /dev/stdout -f 92700000 -s 8000000 - | (another appli
但是我无法将Hackrf管道流变成python脚本。例如,我可能想要对原始数据流进行抽取或以某种方式对其进行操作,然后将其发送到另一个子进程应用程序等,如下所示:
(HackRF)源子流程>>一个python脚本>>接收子过程(例如 baudline)
或在单个python脚本中:
source hackrf>> my_function>>接收器应用
我可以做源>>在python脚本中接收,其中两个应用程序已经接受shell命令,例如hackrf子进程管道进入Baudline子进程stdin管道。换句话说,如果两个应用程序使用管道在shell中工作,则它在python子进程调用中工作。但是我无法在这个shell管道之间获得python函数来使用python脚本或函数来改变数据。
有没有人对我如何做到这一点有任何想法?
答案 0 :(得分:0)
hackrf_transfer
的输出是一个字节流,而不是面向行的,因此readlines()
不起作用;请改用read(8*1024)
。
如果我使用hackout.stdout.read()或hackout.communicate,它会“吸收”数据流。
对,那些没有参数的调用不能用于并行读取连续数据流。
read(size=-1)
:
为方便起见,如果未指定 size 或-1,则返回EOF之前的所有字节。
communicate(input=None, timeout=None)
:
从stdout和stderr读取数据,直到达到文件结尾。等待进程终止。
这就是我告诉我使用read(8*1024)
。
它没有运行错误或消息:data = hackout.stdout.readlines(8 * 1024)但我想把它拿到stdout。我试过sys.stdin.write(数据)它没有写,但它看到'数据'作为一个列表。因此它捕获了数据,但我无法将捕获的数据写回来。
我希望你的意思是read
而不是readlines
,因为我在本文开头所说的原因。
以下是工作代码的草图,基于您在同时删除的“答案”中发布的内容:
hackout = subprocess.Popen(['hackrf_transfer', …], stdout=subprocess.PIPE)
# We need to start the "sink subprocess" at the outset, and that with stdin=PIPE
baudline = subprocess.Popen("baudline … -stdin …", stdin=subprocess.PIPE, shell=True)
def decimator():
for iq_samples in iter(lambda: bytearray(hackout.stdout.read(8*1024)), b''):
# convert the samples chunk for use by numpy, if you wish
dat = np.array(iq_samples)
dat = dat.astype(float)/255
# dat = … do further processing, as you wish
# now convert data back for use by baudline -format u8 and write out
baudline.stdin.write((dat*255).astype('i1').tostring())
decimator()