cygwin 1.5.23-2 : I can't use select() with serial device and socket

Florent Morin morinflorent@gmail.com
Fri Jan 19 09:39:00 GMT 2007


This code works fine on Linux and Cygwin (Windows XP SP2) :
------------------------------- CODE
----------------------------------------------------
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>
#define BUFFER_SIZE 256
#define DEVICE "/dev/ttyS0"
#define TO_WRITE "test communication"
int main (void)
{
 char buffer_read[BUFFER_SIZE];
 int data_read;
 char buffer_write[BUFFER_SIZE] = TO_WRITE;
 int data_write;
 int serial_fd;
 serial_fd = open(DEVICE, O_NONBLOCK | O_NOCTTY | O_RDWR);
 if (serial_fd < 0) {
 perror("open");
 return EXIT_FAILURE;
 } else
 printf("Serial port opened.\n");
 printf("Begin writing %s...\n", buffer_write);
 data_write = write(serial_fd, buffer_write, strlen(buffer_write));
 if (data_write < 0)
 perror("write");
 else
 printf("%d caracters written.\n", data_write);
 memset(&buffer_read, 0, BUFFER_SIZE);
 printf("Begin reading...\n");
 while ((data_read = read(serial_fd,
 buffer_read,
 BUFFER_SIZE - 1)) < 0) {
 if (errno == EAGAIN)
 memset(&buffer_read, 0, BUFFER_SIZE);
 else {
 perror("read");
 return EXIT_FAILURE;
 }
 }
 if (data_read < 0)
 perror("read");
 else
 printf("Data readed (%d) : %s\n", data_read, buffer_read);
 close(serial_fd);
 return EXIT_SUCCESS;
}
---------------------------------------------------------- /CODE
--------------------------------------------
This code works fine on Linux but doesn't work on Cygwin :
-------------------------------------- CODE
-----------------------------------------------
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>
#define BUFFER_SIZE 256
#define DEVICE "/dev/ttyS0"
#define TO_WRITE "test communication"
int main (void)
{
 char buffer_read[BUFFER_SIZE];
 int data_read;
 char buffer_write[BUFFER_SIZE] = TO_WRITE;
 int data_write;
 int serial_fd;
 serial_fd = open(DEVICE, O_NONBLOCK | O_NOCTTY | O_RDWR);
 if (serial_fd < 0) {
 perror("open");
 return EXIT_FAILURE;
 } else
 printf("Serial port opened.\n");
 printf("Begin writing %s...\n", buffer_write);
 data_write = write(serial_fd, buffer_write, strlen(buffer_write));
 if (data_write < 0)
 perror("write");
 else
 printf("%d caracters written.\n", data_write);
 memset(&buffer_read, 0, BUFFER_SIZE);
 printf("Begin reading...\n");
 while ((data_read = read(serial_fd,
 buffer_read,
 BUFFER_SIZE - 1)) < 0) {
 if (errno == EAGAIN)
 memset(&buffer_read, 0, BUFFER_SIZE);
 else {
 perror("read");
 return EXIT_FAILURE;
 }
 }
 if (data_read < 0)
 perror("read");
 else
 printf("Data readed (%d) : %s\n", data_read, buffer_read);
 close(serial_fd);
 return EXIT_SUCCESS;
}
------------------------------------------------ /CODE
----------------------------------------------------------
The second code write on socket, but it says that serial port isn't
ready to read.
Can someone explain it to me ?
Thanks.
Florent.
2007年1月18日, Florent Morin <morinflorent@gmail.com>:
> I use unix names. I will post an example code tomorrow.
>> 2007年1月18日, Brian Dessent <brian@dessent.net>:
> > Florent Morin wrote:
> >
> > > I have a problem using cygwin. My program does this :
> > > - It accept a socket connection,
> > > - it listen on it,
> > > - it open serial device read/write (O_RDWR),
> > > - it create 2 fd_sets,
> > > - listening loop :
> > > - adding file descriptors to sets,
> > > - call select(),
> > > - if something is on serial port, I write it to socket,
> > > - if something is on socket, i write it to serial
> > >
> > > It works fine on Linux.
> > >
> > > With windows, only read or write works fine.
> > >
> > > If I begin on reading on serial, I can't write after (access denied).
> > > If I begin on writing on serial, I can't read after (access denied).
> >
> > There's probably not enough information here to help. It would be
> > easier if you provided a simplified standalone testcase that we can
> > compile and run. Are you opening the serial device using the standard
> > unix name (/dev/ttyS0) and not the DOS name ("COM1")? The latter will
> > succeed but probably not work with things like ioctl or select, because
> > in order to emulate those APIs Cygwin has to know to treat the handle
> > specifically as a serial device, which it only does if you open it using
> > the unix form.
> >
> > Brian
> >
> > --
> > Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
> > Problem reports: http://cygwin.com/problems.html
> > Documentation: http://cygwin.com/docs.html
> > FAQ: http://cygwin.com/faq/
> >
> >
>
--
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
Problem reports: http://cygwin.com/problems.html
Documentation: http://cygwin.com/docs.html
FAQ: http://cygwin.com/faq/


More information about the Cygwin mailing list

AltStyle によって変換されたページ (->オリジナル) /