Не удается получить пакетные данные через порт BullkIO, отправленные с исполняемого устройства

Я хочу создать данные на устройстве и отправить их через порт BulkIO на компонент, работающий внутри Waveform на устройстве. Я считаю, что это правильный способ создания потока данных с аппаратного обеспечения в компонент.

У меня есть порт использования на устройстве:

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, чтобы выяснить, что происходит не так, но я не могу узнать, как контролировать порты в документации.

Я могу получить данные о компоненте в Песочнице, используя этот код:

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)

1 ответ

Решение

Проблема в том, что ваш вызов 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 могут быть полезны для отладки.

Другие вопросы по тегам