MATLAB Answers

Reading a pipe or ouput of a C program into Matlab

81 views (last 30 days)
Sampriti Bhattacharyya
Sampriti Bhattacharyya on 29 Nov 2012
Commented: 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
>> 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
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!


Sign in to comment.

Answers (3)

Tobias Schmocker
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:

pipeClient  = System.IO.Pipes.NamedPipeClientStream(".",'testpipe',...
if pipeClient.IsConnected ~= true
sr = System.IO.StreamReader(pipeClient);
sw = System.IO.StreamWriter(pipeClient);
sw.WriteLine("Test Message");

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...");
      Console.WriteLine("Client connected.");
              string test;
              // receive message
              test = sr.ReadLine();
          catch (Exception ex) { throw ex; }
              if (pipeServer.IsConnected) { pipeServer.Disconnect(); }
     } while (true);

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


Sign in to comment.

Walter Roberson
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.)


Show 2 older comments
Sampriti Bhattacharyya
Sampriti Bhattacharyya on 4 Dec 2012
I use 2010 VC++ .
Was thinking perhaps to use memmapfile to access the data?
Walter Roberson
Walter Roberson on 23 Apr 2018 is a File Exchange submission that can read or write pipes. Unfortunately it does not work bidirectionally.

Sign in to comment.

Sampriti Bhattacharyya
Sampriti Bhattacharyya on 5 Dec 2012
Edited: 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'})
Thanks again!


Sign in to comment.

Sign in to answer this question.

Translated by