Return to BSD News archive
Path: euryale.cc.adfa.oz.au!newshost.anu.edu.au!harbinger.cc.monash.edu.au!munnari.OZ.AU!news.mel.connect.com.au!news.mira.net.au!vic.news.telstra.net!act.news.telstra.net!psgrain!iafrica.com!pipex-sa.net!plug.news.pipex.net!pipex!tank.news.pipex.net!pipex!news.mathworks.com!fu-berlin.de!irz401!orion.sax.de!uriah.heep!news From: j@uriah.heep.sax.de (J Wunsch) Newsgroups: comp.unix.bsd.freebsd.misc Subject: Re: Serial port reading Date: 21 Jul 1996 22:21:36 GMT Organization: Private BSD site, Dresden Lines: 83 Message-ID: <4suahg$1m8@uriah.heep.sax.de> References: <Pine.BSF.3.91.960719175019.5545A-100000@ns.tid.com> Reply-To: joerg_wunsch@uriah.heep.sax.de (Joerg Wunsch) NNTP-Posting-Host: localhost.heep.sax.de Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit X-Newsreader: knews 0.9.6 X-Phone: +49-351-2012 669 X-PGP-Fingerprint: DC 47 E6 E4 FF A6 E9 8F 93 21 E0 7D F9 12 D6 4E Nuno Filipe Monteiro Nunes <nfmn@ns.tid.com> wrote: > So my problem is this: I have a device connected to my pc serial port > (well, to both ports to be more precise...) and it is constantly dumping > text lines which I have to dump to a file. > So the thing is, how can I do this? You need a program that handles the serial line. Most of these programs are rather known as being ``terminal programs''. The system ships with `cu' and `tip', but abusing them to dump raw data from the port to a file is perhaps overkill and overly complicated. There's the famous `kermit' in the ports, it has an option to `log a session'. Still overkill. Alternatively, you can tweak /etc/rc.serial so that your ports will be pre-configured into a well-known state (`clocal' set so they don't wait forever until some modem carrier might appear, correct baud rate, etc.). Then, it should be as simple as cat /dev/cuaa0 > myfile The downside is that there is no good way to terminate this kind of connection. If you interrupt it (^C) or kill it, you might lose unwritten data since the output to `myfile' is probably buffered. You can replace `cat' by the following mini-cat-clone that should properly handle SIGTERM, SIGINT, and SIGHUP: #include <err.h> #include <signal.h> #include <stdio.h> #include <sysexits.h> static void sighandler(int signo) { exit(0); /* Exit cleanly, will flush the output buffer. */ } int main(int argc, char **argv) { FILE *input; char b[512]; size_t amnt; if (argc != 2) errx(EX_USAGE, "usage: minicat inputfile"); if ((input = fopen(argv[1], "r")) == NULL) err(EX_NOINPUT, "fopen(%s)", argv[1]); (void)signal(SIGINT, sighandler); (void)signal(SIGTERM, sighandler); (void)signal(SIGHUP, sighandler); while ((amnt = fread(b, sizeof(char), 512, input)) != 0) (void)fwrite(b, sizeof(char), amnt, stdout); return 0; } (Note that i omitted the error handling for writing stdout, you should add it if you care for the integrity of your output data.) Put the above into `minicat.c', and then cc -O -o minicat minicat.c Then use ./minicat instead of `cat' in my example above. You can either kill the process (with the default signal 15), or interrupt it by ^C if it's running in the foreground. If your line is setup to use modem pseudo-carrier (e.g. since DTR from the remote side is connected to your DCD line, and you have _not_ set the clocal option), then a ``carrier drop'' will result in a SIGHUP sent to the program, which will also exit it cleanly. -- cheers, J"org joerg_wunsch@uriah.heep.sax.de -- http://www.sax.de/~joerg/ -- NIC: JW11-RIPE Never trust an operating system you don't have sources for. ;-)