Hi All,
I'm having some problems using Boost ASIO on Windows XPSP3, 32
bit.
I'm trying to set-up an asynchronous read from a serial port on
the computer (actually a USB port masquerading as a serial port).
The code is at
http://gist.github.com/634618
We regularly call the function
PCTimeoutUart::wait( iseSize_t len, uint32 timeoutInMS ) which
wraps the calls to the boost asio libraries.
This creates a deadline_timer, and binds it to our timeout
callback (PCTimeoutUart::finishedTimer)
It also calls async_read_some on the boost::asio::serial_port object m_port to read the required
length, and binds that to the PCTimeoutUart::finishedRead
callback.
We call the runone() function on m_io, which is declared in the
header as a boost::asio::io_service and has been passed to both
the timer and serial port's constructors.
We continually call this in a loop until either m_timedOut has
been set by the asynchronous call back to
PCTimeoutUart::finishedTimer
or m_finishedRead has been set via the call back to
PCTimeoutUart::finishedRead
Normally, this works well. However, there are certain scenarios
when it fails to write anything to the buffer, despite the fact
that finishedRead() is called with error = 0 and the correct
length . I've checked by initializing the buffers with a couple of
different values and each time, it's clear that the buffer is
being passed back without those values being altered. Strangely,
it is always when the string sent by the external device is
'\r\nNACK:XX\r\n' where XX is a 2 character ascii number.
I've got portmon running on the serial port and it confirms that
the data has been correctly received from the external device.
We've debugged it as far as putting a break-point on line 71 and
at that point can see that the system thinks that a read is
complete, n bytes have been returned, but only some of those bytes
are in buffer.
If anyone could offer any views on why we may be having problems,
or places that we could look, then that would be very much
appreciated.
Thanks in advance,
Jim