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>
