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]

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


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

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);
      options.c_cflag&= ~CSIZE;
      options.c_cflag |= CS8 | CLOCAL | CREAD;
      cfsetispeed(&options, B38400);
      cfsetospeed(&options, B38400);


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

      // Send message to the line

      // 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
      status &= ~TIOCM_DTR;
      status |= TIOCM_RTS;
      ioctl( df, TIOCMSET, &status);

      // Close the port

      return 0;


Unsubscribe info:
Problem reports:

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