Hi Mike,

On Mon, Dec 2, 2013 at 1:45 PM, Mikester <[email protected]> wrote:
>
> Im using a TTYL encoder/decoder counter device that translates the
encoder pulses to a USB serial port.
>
> the call being used is
> int qsb = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NONBLOCK);
> ...
> ioResult = read(qsb, response, responseSize); //EAGAIN error in here

Exactly. This happens because the serial port was opened using O_NONBLOCK.

Opening with O_NONBLOCK is desirable, so you need to add

    fcntl(gsb, F_SETFL, fcntl(gsb, F_GETFL ) & ~O_NONBLOCK);

to turn off non-blocking mode once you've done the open.

Then the read command will block and wait for the data, rather than
returning EAGAIN if the data isn't ready yet.

Also - In general I highly recommend that you put the port in raw mode.
Otherwise if you're sending binary data you'll get a bunch of weird
translations happening and your data will get corrupted. In canonical mode,
it interprets things like backspaces, and may massage your CRs

I use VMIN = 1 and VTIME = 0 which means that read will return as soon as a
single byte is available, but it will return more if its available.
So you may get less data that you asked for, but on the other hand if you
ask for 6 bytes, it won't actually wait for 6 bytes to arrive.

It kind of boils down to the type of error handling that you want to do.
Here's a site that explains the VMIN/VTIME configuration:
http://www.unixwiz.net/techtips/termios-vmin-vtime.html


--
Dave Hylands
Shuswap, BC, Canada
http://www.davehylands.com

-- 
For more options, visit http://beagleboard.org/discuss
--- 
You received this message because you are subscribed to the Google Groups 
"BeagleBoard" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to