Serial port programming

Chris Faylor cgf@cygnus.com
Tue Aug 31 23:49:00 GMT 1999


On Tue, Aug 24, 1999 at 07:29:23AM +0200, Kim Poulsen wrote:
>The problem with fopen() is that it returns a FILE* where open() return
>an int.  fopen() is way to advanced for use with serial port I/O as
>the concept of a FILE is meaningless on a serial channel i.e. there is
>no name or path etc. associated with a raw serial stream.  In
>addition read() and write() uses an int file descriptor and not a FILE*.
>  The open(), read(), and write() functions are the most low level
>I/O handling ANSI C can handle.  The f*() functions are all built on
>these functions.  If I use fopen() I have no way of controlling the
>channel characteristics such as baud rate, bits, parity etc. This
>I can do with the int returned from the open() function.
>  If however you should have some running code (the code below _will_
>run) using fopen() I'd sure like to see it for the educational value.

fileno(), q.v.

>Thanks for your response.
>
>PS:  Why are you posting everything twice ?

You are on the mailing list and in the Cc line.  It's common to receive
two copies in this case.

cgf

>Chris Faylor wrote:
>> 
>> On Mon, Aug 23, 1999 at 11:49:37AM +0200, Kim Poulsen wrote:
>> >Corinna Vinschen wrote:
>> >> Kim Poulsen wrote:
>> >> >   I've got the following problem:
>> >> > I need to access the serial ports of my PC through an ANSI C program.
>> >> > How do I do that ?  I have already tried using fopen("/dev/com2", "r")
>> >> > and fopen("com2", "r") but these only causes a core dump.
>> >> > [...]
>> >> AFAIK this is a known problem in b20.1. Try to use a newer snapshot.
>> >
>> >I have the problem solved.  A a contribution to the mailing list I
>> >submit the solution to the problem below.
>> 
>> I'm not sure how this solves your problem.  You aren't using fopen.  That
>> appears to be it.
>> 
>> As is so often the case, with these kinds of problems, simply running the
>> program using gdb would have probably provided worlds of information for
>> debugging the problem.
>> 
>> If the code sample below is getting you running, then fine.  It is not
>> a generic solution for people who want to use stdio for serial I/O,
>> however.  AFAIK, that does work.
>> 
>> -chris
>> 
>> >#include <fcntl.h>
>> >#include <termios.h>
>> >#include <stdio.h>
>> >#include <unistd.h>
>> >
>> >#define BAUDRATE B9600
>> >#define MODEMDEVICE "com2"
>> >
>> >main()
>> >{
>> >  int fd,c, n;
>> >  char str[2];
>> >  struct termios options;
>> >
>> >  fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY );
>> >  if (fd <0) {perror(MODEMDEVICE); exit(-1); }
>> >
>> >  options.c_cflag = BAUDRATE;
>> >  options.c_cflag &= ~CSIZE; /* Mask the character size bits */
>> >  options.c_cflag |= CS8;    /* Select 8 data bits */
>> >
>> >  /* Write something */
>> >  n = write(fd, "UART is functional\n\r", 19);
>> >  if (n < 0)
>> >    puts("write() of 19 bytes failed!");
>> >
>> >  /* Make read() return immediately */
>> >  fcntl(fd, F_SETFL, FNDELAY);
>> >
>> >  /* Read something until 'Q' recieved */
>> >  while(str[0] != 'Q') {
>> >    if(read(fd, str, 1) != -1) {
>> >      printf("%s\n", str);
>> >    }
>> >  }
>> >}

--
Want to unsubscribe from this list?
Send a message to cygwin-unsubscribe@sourceware.cygnus.com



More information about the Cygwin mailing list