This is the mail archive of the cygwin 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]
Other format: [Raw text]

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


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/


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