我想在设备上创建数据,并通过BulkIO端口将其发送到在设备上的波形内部运行的组件。我相信这是从硬件创建数据流到组件的正确方法。
我在设备上有一个使用端口:
port_dataChar = usesport(name="dataChar",
repid="IDL:BULKIO/dataChar:1.0",
type_="data")
我在设备上运行的组件上有一个提供端口:
port_dataChar = providesport(name="dataChar",
repid="IDL:BULKIO/dataChar:1.0",
type_="data")
我能够使用这个python片段以编程方式连接这些端口:
comp_port = domain.devMgrs[0].devs[0].getPort('dataChar')
dev_port = domain.apps[0].comps[0].getPort('dataChar')
comp_port.connectPort(dev_port, 'ConnectionId')
这一切都非常有效,与我在同一组件/设备对上连接FrontEnd 2.0 DigitalTuner端口的方式非常相似。那些FE 2.0端口运行良好并通过所有测试。
现在,我继续启动设备:
domain.devMgrs[0].devs[0].start()
正在执行此代码:
data = ['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
ts = time.time()
tstamp = BULKIO.PrecisionUTCTime(BULKIO.TCM_CPU,BULKIO.TCS_VALID,0.0,
int(ts),ts - int(ts))
EOS = False
streamId = "1"
print "Sending data of length", len(data)
self.port_dataChar.pushPacket(data, tstamp, EOS, streamId)
return NOOP
打印出Dev Mgr:
Sending data of length 27
Sending data of length 27
Sending data of length 27
Sending data of length 27
Sending data of length 27
Sending data of length 27
...
这一切似乎都很好
然后我继续开始波形:
wave.start()
正在执行此代码:
print "Iteration number ", self.numIter
data, T, EOS, streamID, sri, sriChanged, inputQueueFlushed = self.port_dataChar.getPacket()
if (data != None):
print "Got data of length ", len(data)
else:
print "Got no data, streamId ", streamID
return NOOP
但是,它永远不会从dataChar端口获取任何数据包/数据:
Iteration number 1
Got no data, streamId None
Sending data of length 27
Iteration number 2
Got no data, streamId None
Sending data of length 27
Iteration number 3
Sending data of length 27
Got no data, streamId None
Sending data of length 27
Iteration number 4
Got no data, streamId None
我做错了吗?是否可以通过设备从BulkIO接收数据?我也试图弄清楚如何监控BulkIO端口以找出问题所在,但我无法找到如何监控文档中的端口。
我可以使用以下代码接收Sandbox中组件的数据:
b = sb.Component("MyComponent")
kw = sb.SRIKeyword("SOME_RF",155000000.0,'double')
keywords = [kw]
i = sb.DataSource()
data = ['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
i.connect(b)
sb.start()
i.push(data,SRIKeywords=keywords)
我试图在数据包数据之前推送SRI而没有运气:
keywords = []
H = BULKIO.StreamSRI(1, 0.0, 0.0, BULKIO.UNITS_TIME, 0, 0.0, 0.0, BULKIO.UNITS_NONE, 0, "1", True, keywords)
self.port_dataChar.pushSRI(H)
self.port_dataChar.pushPacket(data, tstamp, EOS, streamID)
更新:我现在可以自己回答这个问题了。问题在于发送到pushPacket()的格式。它应该是一个字符串而不是通过dataChar BulkIO端口发送的字符数组。基本上就是这样:
data = ['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
self.port_dataChar.pushPacket(data, tstamp, EOS, streamId)
应改为:
data = "testing123"
self.port_dataChar.pushPacket(data, tstamp, EOS, streamId)
答案 0 :(得分:0)
问题是你的pushPacket()调用导致CORBA.BAD_PARAM(omniORB.BAD_PARAM_WrongPythonType, CORBA.COMPLETED_NO)
异常并以静默方式失败(使用版本1.9.0的REDHAWK)。 dataChar旨在用于字符数据,事实证明,底层的omniORBpy / BulkIO映射需要一个字符串值,而不是数据变量的字符串列表。如果您需要将设备中的字符数据发送到组件,则应使用:
data = "your text here"
self.port_dataChar.pushPacket(data, tstamp, EOS, streamId)
如果您的目的只是让BulkIO数据从您的设备流向您的组件,我建议您使用dataFloat端口。
如果要监控端口的输出,REDHAWK IDE中的端口监视器和数据列表视图可用于调试。