This is the mail archive of the cygwin@sources.redhat.com mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Serial I/O multi-thread safe?



I have a cygwin application that opens /dev/com2 in binary mode for I/O
to a external device at 115200 bps. I'm
using cygwin 1.1.7 on Windows 2000 SP1. The serial I/O is done using
read() and write() in blocking mode.

If I write commands to the device and read the responses from the main
thread, all is well. But I need to
use separate threads (pthreads) one for writing and one for reading.
When I do this, the first command and response is ok, but the second
response includes more data than it should. In the multi-threaded
version, the read thread is normally
blocked on a read(). Here's the good single threaded output translated
to hex:

write : 01 01 ff 06 5e a5 ff ff 02 00

read: 04 0E 04 0A 01 ff 00

write: 01 01 ff 06 A0 a4 ff ff 00 2E

read: 04 0E 04 0A 01 ff 00


Using the multi-threaded application I get:

write : 01 01 ff 06 5e a5 ff ff 02 00

read: 04 0E 04 0A 01 ff 00

write: 01 01 ff 06 A0 a4 ff ff 00 2E

read: 04 0e 04 0a 01 ff 00 00 00 00 0e 04 0a 01 ff 00

That last read returned 16 bytes rather than 7. The first 7 are valid,
but the other 9 are bogus.

I've tried cygwin1.dll from V1.1.6, and V1.1.5 with the same results.
I've also checked with a serial line analyzer
to make sure that the extra bytes are not being sent on the wire. And I
have experimented with various tcsetaddr() settings
to no avail. The trace data above is output immediately after read()
completes, so a bug in the application code is unlikely.

I have set the serial port attributes as follows to let the read()
complete with less than a full buffer:
	serialPortAttributes.c_cc[VTIME]    = 0;   /* inter-character timer
unused */
	serialPortAttributes.c_cc[VMIN]     = 1;   /* blocking read until at
least 1 char received */

I should also mention that the multi-threaded application works fine on
RedHat Linux.

Any ideas?

Thanks

- Bill Hegardt

--
Want to unsubscribe from this list?
Check out: http://cygwin.com/ml/#unsubscribe-simple


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]