[PD] TCP/IP communication from the unix server to the Pure Data

Martin Peach martin.peach at sympatico.ca
Mon Mar 11 14:31:47 CET 2013


On 2013-03-10 17:58, Petar Jercic wrote:
> Sorry, I can't use ASCII text as communication method, since I plan to
> send large quantities of data at high speed rates, I need to optimize it
> as much as possible. Compared to streaming bytes, ASCII is inefficient
> up to a several orders of magnitude.
>
> Is there a method for correct endianness in Pure Data, like these C
> functions:
>
> ntohs()--"Network to Host Short"
> ntohl()--"Network to Host Long"

You can do that with Pd like this (ntohs):

[unpack 0 0]
|          |
[* 256]    |
|          |
[+          ]
|
[   \

or

[unpack 0 0]
|          |
|          [* 256]
|          |
[+          ]
|
[   \

for littleendian.

Floats are harder but still possible. The main difficulty is in 
splitting the incoming stream in the right places. (I think ASCII is not 
orders of magnitude slower, and it is also less ambiguous).

Martin



>
> On 09/3/13 5:15 PM, Martin Peach wrote:
>> It's probably safer to get the server to send the numbers as ASCII
>> text, to avoid disagreements about endianness and floating-point
>> representation.
>> Then, to extract the numbers, you could use [moocow/bytes2any] or make
>> a custom parser using [pdlua].
>>
>> Martin
>>
>>
>> On 2013-03-09 10:55, Petar Jercic wrote:
>>> Apparently [netclient] on the Pure Data side cannot receive nothing else
>>> than ; delimited messages.
>>> So the solution for the problem:
>>> *My question is, is there a way to send something other than string
>>> message to Pure Data, like byte-stream or serialized number stream? Can
>>> Pure Data receive such messages?*
>>>
>>> The solution is to use [tcpclient], it can receive byte-stream data.
>>>
>>> Now I have another problem regarding the data read, on how to convert it
>>> back to usable numbers.
>>>
>>>  From my UNIX server I am sending a structure
>>>
>>> typedef struct {
>>>      int     var_code;
>>>      int    sample_time;
>>>      int     hr;
>>>      float    hs;
>>> } phy_data;
>>>
>>> Sample data might be 2 1000000 51 2000.56
>>>
>>> When received and printed  in Pure Data I get output like this:
>>>
>>>  >>>: 2 0 0 0 104 34 9 0 51 0 0 0 235 50 48 69
>>>
>>> You can notice number 2 and number 51 clearly, I guess the others are
>>> correct as well. Might be some network inversion of LSB/MSB.
>>>
>>> *How can I get these numbers back to a usable format and get them in
>>> separate variables?
>>>
>>> *//Petar*
>>> *
>>>
>>>
>>> _______________________________________________
>>> Pd-list at iem.at mailing list
>>> UNSUBSCRIBE and account-management ->
>>> http://lists.puredata.info/listinfo/pd-list
>>>
>>
>
>
>




More information about the Pd-list mailing list