2016-05-08 3 views
2

У меня есть .net DLL (C#), которая получает в реальном времени (и много) данные по TCP от датчика. Данные поступают как массивы пользовательских объектов. (назовите это SensorPacket, который имеет около 20 полей, в основном float и int).return struct from .net dll (C#)

Я отправлял это в Matlab через события (отлично работает). Но Matlab рассматривает их как массив объектов .NET. Я бы предпочел отправить это как массив структуры. Как?

да, можно преобразовать этот массив в массив ячеек с помощью:

http://www.mathworks.com/help/matlab/matlab_external/net-arrays-to-cell-arrays.html

, но это все еще оставляет это как массив ячеек .net объектов. Можно ли отбросить объекты, чтобы я мог получить значения?

и лучше было бы отправить ячейку/массив структуры.

Я попытался преобразовать это в JSON, и с помощью MatLab JSON читателя преобразовать структур, но это очень и очень медленно: http://www.mathworks.com/matlabcentral/fileexchange/33381-jsonlab--a-toolbox-to-encode-decode-json-files

Не смейтесь, но я имею в виду с помощью DLL для напишите файл .MAT, а затем отправьте дескриптор в Matlab. Этот писатель может работать: http://www.mathworks.com/matlabcentral/fileexchange/16319-csmatio--mat-file-i-o-api-for-net-2-0

На следующей странице, он говорит, что я могу вернуться структуры или класса, но мой опыт показывает, что это возвращает System.Object

http://www.mathworks.com/help/matlab/matlab_external/handling-net-data-in-matlab_bte9owt-1.html

ответ

0

Ну, кажется, что в отличие от файлов с обычным C, mex вы не можете возвращать собственные структуры и объект matlab. Но вы можете вернуть объект C# для класса, который вы определяете, и вы можете получить доступ к свойствам из Matlab (просто выполните свойства (netObj), и вы увидите это. Правда, вы увидите System.String [] для строк, но который может быть исправлен путем выполнения char() для объекта. Большинство других скаляров также работают.

В моем случае я получаю сообщения JSON через SingnalR, преобразуя их в объект ExpandDo, а затем создавая отдельные объекты класса, и отправляет EVENTS в Matlab.Это все работает, и на 20X быстрее, чем Matlab, анализирует JSON, но все же немного медленнее для реальной работы. Теперь я начинаю использовать инструменты csmatio (https://sourceforge.net/projects/csmatio) для записи файла .MAT , а затем я буду сигнализировать Matlab, что данные готовы к этому.

Но ниже вы можете увидеть мой C# код для того, как я это делаю сейчас: (обратите внимание, вы можете просто создавать .NET-события), и они появятся в Matlab точно так же, как любые события Matlab, и передадут значения в качестве аргументов! Я делаю task.invoke, чтобы поддерживать поток в .NET от зависания, в то время как Matlab обрабатывает данные.

public delegate void PostPerson(Portal sender, dynamic e); 
    public event PostPerson Post; 

     private void deliver(dynamic packet) 
    { 
     var converter = new ExpandoObjectConverter(); 
     dynamic data = JsonConvert.DeserializeObject<ExpandoObject>(packet.ToString(), converter); 
     dynamic mail; 
     String channelName = (string)data.Channel; 
     switch (channelName) 
     { 
      case "Oxford": 
       mail = new Oxford(data); 
       break; 
      case "RADAR": 
       mail = new Radar(data); 
       break; 
      case "SVSRear": 
       mail = new SVS(data); 
       break; 
      case "SVSFront": 
       mail = new SVS(data); 
       break; 
      case "IBEO": 
       mail = new IBEO(data); 
       break; 
      case "Fusion": 
       mail = new Fusion(data); 
       break; 
      default: 
       postFail(String.Format("Portal: deliver: Unknown Channel: {0}", channelName)); 
       return; 
     } 
     trigger(mail); 
    } 
    private void trigger(dynamic e) 
    { 
     if (Post != null) 
     { 
      //Post(this, e); 
      Task.Factory.StartNew(() => { Post(this, e); }); 
     } 
    }