This is the mail archive of the cygwin@sourceware.cygnus.com 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]

Re: Serial port programming


Why not combine the two?
Use open() to startup, and set the control, then fdopen()
once the configuration is established and you are happy to
just read and write?

Just a thought :)

--Geoff

Kim Poulsen wrote:
> 
> Chris,
> 
> 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.
> 
> Thanks for your response.
>   /Kim
> 
> PS:  Why are you posting everything twice ?
> 
> 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
> 
> --
>  Kim Poulsen, B.Sc.E.E, System Developer HW
>  Ericsson Telebit A/S     Tel: + 45 86 28 81 76
>  Fabriksvej 11            Fax: + 45 86 28 81 86
>  DK-8260 Viby J           E-mail: info@tbit.dk
>  Denmark                  URL: http://www.tbit.dk/
> 
> --
> Want to unsubscribe from this list?
> Send a message to cygwin-unsubscribe@sourceware.cygnus.com

-- 
                                   (__)
                                   (oo)
                            /-------\/
Geoff Appleby              / |     ||              geoff@topic.com.au
Internet Engineer         *  ||----||             Ph: +61 2 6257 7111
tSA Consulting Group         ^^    ^^            Fax: +61 2 6257 7311

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


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