Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 16 Jan 2003 15:44:01 +0800
From:      "Paul Hamilton" <paul@computerwest.com.au>
To:        "Giorgos Keramidas" <keramida@ceid.upatras.gr>, "Paul Hamilton" <paul@computerwest.com.au>
Cc:        <freebsd-questions@FreeBSD.ORG>
Subject:   RE: How do I monitor the serial CTS line via C programmatically?
Message-ID:  <AGEHIFHGNEMPFNCPLONMIENIEBAA.paul@compwest.com.au>
In-Reply-To: <20030115112042.GA26041@gothmog.gr>

next in thread | previous in thread | raw e-mail | index | archive | help
Thanks Giorgos!

I needed to know the function used to access the Serial ports under FreeBSD.

Your program compiles, but generates the following error msg when run:


test_prog: ioctl: Inappropriate ioctl for device

Thanks to the ioctl 'tip', I researched around, and found that the serial
port needed opening, so this is the finished code (just in case someone else
needs it):


    #include <sys/ioctl.h>
    #include <errno.h>
    #include <fcntl.h>
    #include <termios.h> /*Originally it was termio.h*/
    #include <stdio.h>
    #include <unistd.h>

    int
    main(void)
    {
            int bits;
            int last;
            int dcf_dev;

            if((dcf_dev = open("/dev/cuaa1", O_RDWR|O_NOCTTY)) < 0)
            {
                perror("open /dev/cuaa0");
                return (-1);
            }


            if (ioctl(dcf_dev, TIOCMGET, &bits) == -1)
                    err(1, "ioctl");
            last = bits & TIOCM_CTS;
            printf("CTS %s.\n", last ? "on" : "off");

            while (1) {
                    if (ioctl(dcf_dev, TIOCMGET, &bits) == -1)
                            err(1, "ioctl");
                    if ((last ^ (bits & TIOCM_CTS)) != 0) {
                            last = bits & TIOCM_CTS;
                            printf("CTS %s.\n", last ? "on" : "off");
                    }
                    usleep(100000);
            }

            return (0);
    }

Brilliant!!  :-)

Thanks for that!

Cheers,

Paul Hamilton

-----Original Message-----
From: owner-freebsd-questions@FreeBSD.ORG
[mailto:owner-freebsd-questions@FreeBSD.ORG]On Behalf Of Giorgos
Keramidas
Sent: Wednesday, 15 January 2003 7:21 PM
To: Paul Hamilton
Cc: freebsd-questions@FreeBSD.ORG
Subject: Re: How do I monitor the serial CTS line via C
programmatically?


On 2003-01-15 18:26, paul@computerwest.com.au (Paul Hamilton) wrote:
> I have been trying to monitor the serial CTS line.  I would like to
> log the fact that the CTS has changed state (active/non-active).
>
> I have been trying to adapt some Linux programs, but am having
> problems with adapting the POSIX TIOCMGET function.
>
> Is there a FreeBSD way?

You'd have to poll using ioctl(fd, TIOCMGET, &int) and detect CTS
changes by checking the TIOCM_CTS bit in the returned value.  The
following (untested) sample program should be easy to adapt to your
needs.  When TIOCM_CTS changes from on to off or vice versa, the
program should print the change.

    #include <sys/ioctl.h>

    #include <stdio.h>
    #include <unistd.h>

    int
    main(void)
    {
	    int bits;
	    int last;

	    if (ioctl(0, TIOCMGET, &bits) == -1)
		    err(1, "ioctl");
	    last = bits & TIOCM_CTS;
	    printf("CTS %s.\n", last ? "on" : "off");

	    while (1) {
		    if (ioctl(0, TIOCMGET, &bits) == -1)
			    err(1, "ioctl");
		    if ((last ^ (bits & TIOCM_CTS)) != 0) {
			    last = bits & TIOCM_CTS;
			    printf("CTS %s.\n", last ? "on" : "off");
		    }
		    usleep(100000);
	    }

	    return (0);
    }


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-questions" in the body of the message




To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-questions" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?AGEHIFHGNEMPFNCPLONMIENIEBAA.paul>