In some cases there are advantages to creating a separate IOExtSer for
reading and writing. This allows simultaneous operation of both reading
and writing. Some users of the device have separate tasks for read and
write operations. The sample code below creates a separate reply port and
request for writing to the serial device.
struct IOExtSer *SerialWriteIO;
struct MsgPort *SerialWriteMP;
/*
* If two tasks will use the same device at the same time, it is
* preferred use two OpenDevice() calls and SHARED mode. If exclusive
* access mode is required, then you will need to copy an existing
* IORequest.
* Remember that two separate tasks will require two message ports.
*/
SerialWriteMP = CreatePort(0,0);
SerialWriteIO = (struct IOExtSer *)
CreateExtIO( SerialWriteMP,sizeof(struct IOExtSer) );
if (SerialWriteMP && SerialWriteIO )
{
/* Copy over the entire old IO request, then stuff the
* new Message port pointer.
*/
CopyMem( SerialIO, SerialWriteIO, sizeof(struct IOExtSer) );
SerialWriteIO->IOSer.io_Message.mn_ReplyPort = SerialWriteMP;
SerialWriteIO->IOSer.io_Command = CMD_WRITE;
SerialWriteIO->IOSer.io_Length = -1;
SerialWriteIO->IOSer.io_Data = (APTR)"A poet's food is love and fame";
DoIO(SerialWriteIO);
}
Where's OpenDevice()?
---------------------
This code assumes that the OpenDevice() function has already been
called. The initialized read request block is copied onto the new
write request block.