Serial programming - Writing bytes in a blocking mode - Problem with tcdrain() ?

pbenito@cemitec.com pbenito@cemitec.com
Mon May 16 10:29:00 GMT 2005


Hi,

I'm trying to use the serial port with Cygwin, and here is my problem:

I can successfully write on the line, but I need to switch the RTS and DTR
lines just AFTER the last byte is written in the line. I put the bytes that
I want in the line with the command Write and I wait for the last byte to
be written with tcdrain() and then I switch the RTS and RTS lines. But when
I see the signals in the oscilloscope I realized that the tcdrain call is
not waiting till the output buffer is empty and I switch the RTS and DTR
lines before I write all the bytes !! I attach my code, is it something
wrong with it or is there a problem with the tcdrain call in cygwin? On a
Linux box, tcdrain call seems to work fine...


 I'm running Cygwin v1.65 on a Windows XP SP2 machine.

Thanks for your help
Cheers

Pablo Benito



#include <termios.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>


#define PORT "/dev/ttyS0"

int main() {

      int fd,status;
      char *msg ="Hello world!";
      struct termios options;

      // Open the serial port, and configuration
      fd = open(PORT, O_RDWR | O_NOCTTY  | O_SYNC);
      tcgetattr(fd,&options);
      options.c_cflag&= ~CSIZE;
      options.c_cflag |= CS8 | CLOCAL | CREAD;
      cfsetispeed(&options, B38400);
      cfsetospeed(&options, B38400);

      tcsetattr(fd,TCSANOW,&opciones);
      tcflush(fd,TCIOFLUSH);

      // Set the RTS and DTR lines to the initial value
      ioctl(fd,TIOCMGET,&status);
      status |= TIOCM_DTR;
      status &= ~TIOCM_RTS;
      ioctl( df, TIOCMSET, &status);

      // Send message to the line
      write(fd,msg,strlen(msg));

      // Waiting until the output buffer is empty ----------> Here comes
the problem
      tcdrain(fd);                        // tcdrain(fd) not waiting
????!?!??

      // Change back the RTS and DTR lines to their initial value
      ioctl(fd,TIOCMGET,&status);
      status &= ~TIOCM_DTR;
      status |= TIOCM_RTS;
      ioctl( df, TIOCMSET, &status);

      // Close the port
      close(fd);

      return 0;

}







--
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