Преобразование массива приведенного типа, полученного из программы Labview, в массив с плавающей запятой с использованием переполнения стека

У меня есть программа в labview, которая отправляет пакеты UDP и с помощью программы php я получаю эти пакеты. Так что программа labview — отправитель, а программа php — получатель.

В программе labview массив типа float приводится к строке с использованием функционального блока приведения типа и отправляется в виде пакетов UDP. При получении этих пакетов с использованием php, я получаю некоторые данные, которые не в читаемом формате.

введите описание изображения здесь

Я попытался преобразовать строковый массив в массив float, используя array_map (‘floatval’, $ array). Но все же значения не приходят в читаемом формате.

Пожалуйста, помогите мне решить эту проблему.

1

Решение

Помощь LabVIEW для Тип ролях указывает на документ сведенные данные который упоминает, что представление является старшим байтом (самый старший байт сначала). Запись на Как LabVIEW хранит данные в памяти показывает фактическое представление числа с плавающей запятой одинарной точности (SGL):

SGL представительство

Теперь, когда вы знаете, что посылает LabVIEW, ваш вопрос заключается в том, как декодировать это в PHP — если вы не можете решить это самостоятельно, я предлагаю задать новый вопрос.

Если вы можете изменить код LabVIEW, вы можете изменить формат, в котором отправляются данные, чтобы облегчить декодирование на другом конце. Возможные варианты могут включать:

  • Если пропускная способность сети не является проблемой, используйте стандартный текстовый формат, такой как JSON
  • Если JSON слишком велик, но вы можете позволить себе восемь байтов на значение, преобразуйте в DBL — используя преобразование ‘bullet’ из числовой палитры — перед сглаживанием в строку, а затем переупорядочиваем байты строки в порядке с прямым порядком байтов в конце LabVIEW. Из комментария Тон Пломп, это может быть правильным для вашего текущего кода PHP.
  • Если вы действительно не можете позволить себе более четырех байтов на значение, но диапазон значений данных не слишком широк, вы можете масштабировать их до целочисленного значения (U32 или же I32) до сплющивания; опять же, это может быть проще для декодирования на другом конце.

Обратите внимание, что, хотя формат данных, который вы получаете от Type Cast и / или Flatten к String, задокументирован и исторически был стабильным, я не думаю, что абсолютно гарантировано не переключаться между версиями LabVIEW.

2

Другие решения

Также нечитаемый раздел данных может быть информацией заголовка, добавленной функцией UDP. Вы можете проанализировать эти данные и выбросить.

Еще одна вещь, которую стоит попробовать — это прочитать данные UDP Rx в Labview и сравнить с данными Tx, чтобы попытаться определить, что происходит.

0

По вопросам рекламы [email protected]