Main Content

rtIOStreamSend

Send data through communication channel

Description

example

errFlag = rtIOStreamSend(streamID, src, size, sizeSent) sends data through a communication stream.

The API for rtIOStream functions is independent of the physical layer across which you send the data, for example, RS232, Ethernet, or Controller Area Network (CAN). The choice of physical layer affects the achievable data rates for communication between your development computer and target processor.

For a processor-in-the-loop (PIL) application, there is no minimum data rate requirement. The higher the data rate is, the faster the simulation runs.

A communications device driver can require additional hardware-specific or channel-specific configuration parameters. For example:

  • A CAN channel can require the specification of the CAN node that is used.

  • A TCP/IP channel can require the configuration of a port or static IP address.

  • A CAN channel can require the specification of the CAN message ID and priority.

When you implement the rtIOStream driver functions, provide this configuration data, for example, by hard-coding the data or by supplying arguments to rtIOStreamOpen.

Examples

Send and Receive Data from Processor

This code from rtiostreamtest.c shows how to send and receive data from a target processor.

static void blockingIO(int send, unsigned long numMemUnits)
{
    size_t sizeToTransfer = (size_t) numMemUnits; 
    size_t sizeTransferred;
    IOUnit_T * ioPtr = (IOUnit_T *) &buff[0];
    int status;

    if (numMemUnits > BUFFER_SIZE)
    {
        AckCode = stat_notEnoughSpace;
        AckArg0 = BUFFER_SIZE;
        return;
    }

#ifdef HOST_WORD_ADDRESSABLE_TESTING       
   /* map to bytes */
   sizeToTransfer *= MEM_UNIT_BYTES;
#endif

   while (sizeToTransfer > 0) {
      sizeTransferred = 0;
      /* Do the low level call */
      status = send ?
         rtIOStreamSend(streamID, ioPtr, sizeToTransfer, &sizeTransferred) :
         rtIOStreamRecv(streamID, ioPtr, sizeToTransfer, &sizeTransferred);

      if (status != RTIOSTREAM_NO_ERROR) {
         if (AckCode == stat_OK) {
            AckCode = stat_RTIOSTREAM_ERROR;
            AckArg0 = data_counter;
         }
         return;
      }
      else {
         sizeToTransfer -= sizeTransferred;
         ioPtr += sizeTransferred;
      }
   }
}

Input Arguments

collapse all

Handle to the stream returned by a previous call to rtIOStreamOpen.

Pointer to the start of the buffer that contains a data array for transmission.

Size of data to transmit from the source buffer. For byte-addressable architectures, size is measured in bytes. Some DSP architectures are not byte-addressable. In these cases, size is measured in number of WORDs, where sizeof(WORD) == 1.

Output Arguments

collapse all

If the function runs without errors, it returns zero. Otherwise, it returns -1.

The rtiostream.h file defines these macros:

#define RTIOSTREAM_ERROR (-1)
#define RTIOSTREAM_NO_ERROR (0)

Size of transmitted data, which is less than or equal to size. If data is not transmitted, value is zero.

Introduced in R2009a