Hmm well I'm not entirely sure what I've done correctly now...but this seems to work!
Another problem with the stream...but another thread would serve it well.
Thanks all for the help :-)
--rob
Jonathan - thank you, that's helped massively. I now have a serial_device type along the lines you described :-)
Bob - thanks for the asio suggestion - I decided that it wasn't quite what I'm looking for though.
Eric - I realised I actually configure the serial port as a blocking device so it should be fine.
My final (I hope!) problem is in using a stream.
I cannot compile a program creating a stream object templated for my serial device:#include <boost/iostreams/stream.hpp>#include "serial_device.h"
int main(void) {
boost::iostreams::stream<serial_device> s;
}
Compiling that with g++ 3.3.3 gives:test-stream.cpp: In function `int main()':
test-stream.cpp:5: error: invalid use of template `template<class Device,
class Tr, class Alloc> struct boost::iostreams::stream'
test-stream.cpp:5: error: syntax error before `;' token
This is with Boost 1.34.1
Can any of you shed any light on this please?!
Thanks for all the help so far :-)
--rob
On Jan 21, 2008 3:09 PM, Eric MALENFANT < Eric.Malenfant@sagem-interstar.com> wrote:> Rob Desbois, le 18 janvier 2008 08:02:
>
> >
> > After trying to compile I realised that a SeekableDevice
> > provides read, write and seek functions, nothing else.
> > Am I seriously misunderstanding the point of
> boost::iostreams?
> On Jan 18, 2008 6:46 PM, Eric MALENFANT
> < Eric.Malenfant@sagem-interstar.com > wrote:> A file_descriptor only implements the Device concept,> Rob Desbois, le 18 janvier 2008 13:58:
> it not an std::iostream.
> If you want an std::iostream, you wrap the Device in a
> boost::iostreams::stream which, as stated in its
> documentation: "performs i/o by delegating to a contained
> Device", and "derives from a specialization of
> std::basic_istream, std::basic_ostream or
> std::basic_iostream, depending on whether the underlying
> Device models Source, Sink or both.">The "seekability" should not be a problem. You could define a BidirectionalDevice as Jonathan suggests in another message. If you only need read (or write), you could even just define a Source (or Sink).
> Are you able to comment on whether I 'should' be doing this
> as regards the non-blocking and non-seekable nature of a serial port?
The "blocking" side of things may be more trouble, depending on your needs.
Boost.Iostreams offers minimal support for non-blocking strings: boost::iostreams::char_traits::would_block() can be used to indicate that a read or write attempt was interrupted but, unless I missed something, nothing allows the caller to wait for the blocking condition to be removed (like select() allows for non-blocking sockets, for example), so the caller has to poll the stream. As suggested by Bob Warren, Boost.Asio may offer an interesting alternative.
Éric Malenfant
---------------------------------------------
Amateur programmers think there are 1000 bytes in a kilobyte;
Real Programmers think there are 1024 meters in a kilometer._______________________________________________
Boost-users mailing list
Boost-users@lists.boost.org
http://lists.boost.org/mailman/listinfo.cgi/boost-users--
Rob Desbois
Eml: rob.desbois@gmail.com
Tel: 07946 705987
"There's a whale there's a whale there's a whale fish" he cried, and the whale was in full view.
...Then ooh welcome. Ahhh. Ooh mug welcome.