我使用USRP最新版本和Python3.6作为编程环境,在Windows 10系统上有2台B210收音机在USB3上。我可以“某种程度上”在单独的进程中同时运行它们,但是我想知道是否可以在一个线程中运行它们?多么?
如果能让事情变得更简单的话,我很高兴搬到Linux,我只是更熟悉Windows。
2“有点”=我有时会得到错误,这可能是两个进程在堆栈的某个地方发生冲突。
下面的代码说明了争用条件,有时一个或两个进程出现错误代码40 (UHD_ERROR_ASSERTION)或偶尔出现代码11 ( UHD_ERROR_KEY )失败。
from ctypes import (windll, byref, c_void_p, c_char_p)
from multiprocessing import Process, current_process
def pread(argstring):
# get handle for device
usrp = c_void_p(0)
uhdapi = windll.uhd
p_str=c_char_p(argstring.encode("UTF8"))
errNo = uhdapi.uhd_usrp_make(byref(usrp),p_str)
if errNo != 0:
print("\r*****************************************************************")
print("ERROR: ",errNo," IN: ", current_process())
print("=================================================================")
if usrp.value != 0:
uhdapi.uhd_usrp_free(byref(usrp))
return
if __name__ == '__main__':
while True:
p2 = Process(target=pread, args=("",))
p1 = Process(target=pread, args=("",))
p1.start()
p2.start()
p1.join()
p2.join()
print("end")发布于 2017-03-21 19:32:31
是的,您可以有多个multi_usrp句柄。
顺便说一句,注意UHD本质上是C++,而C只是一个包装器。它是为生成脚本接口而设计的,比如您正在使用的Python (不知道Python和您正在使用的C之间的哪个接口--是自写的吗?)。
虽然有可能,但是没有充分的理由从同一个线程调用recv和send函数--大多数现代机器都是多线程的,您应该利用这一点。实时SDR是一个CPU密集型任务,您应该使用所有可用的CPU资源来获取与驱动程序之间的数据,以避免缓冲区溢出。
https://stackoverflow.com/questions/42936122
复制相似问题