MATLAB Answers

1

Reading a pipe or ouput of a C program into Matlab

Asked by Sampriti Bhattacharyya on 29 Nov 2012
Latest activity Commented on by Walter Roberson
on 23 Apr 2018
I want to read out a pipe into matlab, but this isn't working. I have a windows computer
>>NET.addAssembly('System');
>> pipeStream = System.IO.Pipes.NamedPipeServerStream('testpipe', System.IO.Pipes.PipeDirection.Out)
Undefined variable "System" or function "System.IO.Pipes.PipeDirection.Out".
Then I tried popen
popen('C:\Documents\ServerPipe\ServerPipe.exe')
Undefined function 'popen' for input arguments of type 'char'.
>> popen(C:\Documents\ServerPipe\ServerPipe.exe)
|
Error: Unexpected MATLAB operator.
Infact poen doesnt exist in windows i think.
And yet, dateObj = System.DateTime.Now works fine! Help please! I need to get it working!

  0 Comments

Sign in to comment.

3 Answers

Answer by Tobias Schmocker on 18 Apr 2018

Hi, it's an old topic, but i'm currently working on bidirectional inter process comunication between matlab and c# using a named pipe from .NET.

My Matlab code locks like this:

NET.addAssembly('System.Core');
pipeClient  = System.IO.Pipes.NamedPipeClientStream(".",'testpipe',...
    System.IO.Pipes.PipeDirection.InOut,...
    System.IO.Pipes.PipeOptions.Asynchronous);
if pipeClient.IsConnected ~= true
    pipeClient.Connect(2000);
end
sr = System.IO.StreamReader(pipeClient);
sw = System.IO.StreamWriter(pipeClient);
sw.WriteLine("Test Message");
sw.Flush();

in c# my code look's like this:

using (NamedPipeServerStream pipeServer = new NamedPipeServerStream("testpipe", PipeDirection.InOut, 4))
{
    StreamReader sr = new StreamReader(pipeServer);
    StreamWriter sw = new StreamWriter(pipeServer);
    Console.WriteLine("NamedPipeServerStream object created.");
      // Wait for a client to connect
      Console.Write("Waiting for client connection...");
      pipeServer.WaitForConnection();
      Console.WriteLine("Client connected.");
      do
      {
          try
          {
              string test;
              // receive message
              pipeServer.WaitForPipeDrain();
              test = sr.ReadLine();
              Console.WriteLine(test);
              //sw.WriteLine("Waiting");
              //sw.Flush();
          }
          catch (Exception ex) { throw ex; }
          finally
          {
              pipeServer.WaitForPipeDrain();
              if (pipeServer.IsConnected) { pipeServer.Disconnect(); }
          }
     } while (true);
}

Unfortunately, the pipe get's closed after each flush. Anyway, I hope this helps someone

  0 Comments

Sign in to comment.


Answer by Walter Roberson
on 29 Nov 2012

The popen() system call does exist on MS Windows XP SP2 and later, but MATLAB does not offer an interface to that system call.
Unless you can find a way to use ActiveX, you would need to mex up a pipe interface.
Please note that MATLAB's built-in fwrite() and other I/O functions do not flush buffers, and that it is not certain that MATLAB's fseek() flushes buffers and there is no flush call in MATLAB. (These problems might possibly have changed in R2012b: work was done to allow diary() to flush more quickly, and that work might possibly imply something about flushing in general.)

  5 Comments

I use 2010 VC++ .
Was thinking perhaps to use memmapfile to access the data?
memmapfile() cannot be used to access pipes.

https://www.mathworks.com/matlabcentral/fileexchange/13851-popen-read-and-write is a File Exchange submission that can read or write pipes. Unfortunately it does not work bidirectionally.

Sign in to comment.


Answer by Sampriti Bhattacharyya on 5 Dec 2012
Edited by Walter Roberson
on 5 Dec 2012

Walter, you are right. Could not figure out to use mex in this case, so tried out memmapfile. memmapfile can be used to access the output of a C code. I am reading output in real time, so I have a C program that reads it from the serial port and matlab which at the same time access the data which the C program is storing in a file. This might be useful for anyone, so here's the command
>>objname = memmapfile('Filename with filepath', ...
'Format', { 'uint64' [1] 'time'; 'double' [3] 'acc'; 'double' [3] 'ang'})
>>objname.Writable=true;
Thanks again!

  0 Comments

Sign in to comment.