vern@zebra.UUCP (Vernon C. Hoxie) (01/06/89)
	I have been trying to write a test program for a Trailblazer.
It is connected to /dev/tty000.  The program opens this file with:
	fd = open("/dev/tty000", O_RDWR | O_NDELAY);
I then do:
	if (ioctl(fd, TCGETA, &tsavetty) == -1) exit();
Then after some other housekeeping:
	char buf[512];
	.
	.
	k = read(fd, buf, 211);
It is written:
	 "When attempting to read a file associated with a tty that has
	  no data currently available."
This infers that when data is available, the number of characters will
be returned.  Sure enough, when a command is sent to the modem, various
numbers are returned depending upon the command sent.  So far so good.
	When 'buf' is read out, all I get are ^@'s.  Between reads,
the buffer is rewritten with 'z's so the ^@'s are indeed the characters
which are in the buffer.  I have tried this with every configuration of
the 'struct termio' that is possible and still all I get are ^@'s!
(^@ = NUL = 0 = 0x0000).
	I tried connecting a stream with the fdopen(fd, strm) where
FILE *strm.  Then using ch = fgetc(strm) I get ^A's.
(^A = SOH = 1 = 0x0001).
	Another tactic I thought about was to access the clist directly.
When I referred to /usr/include/sys/tty.h I read:
	/* Macro to find clist structure given pointer into it	*/
Nowhere can I find out how to grab that "given pointer".  The author of
that header didn't even include a smiley face! :-)
	There ought to be a more standard method of recovering the
returned characters.  Oh, by the way, the modem does work when running
on pcomm2.  I am confident that it will also work under uucp but I would
like to finish this test program before I put it into operation.
	I will certainly appreciate any help you can suggest.  Yes, I
will offer the program to the net if I can get it to work.
-- 
Vernon C. Hoxie		       {ncar,nbires,boulder,isis}!scicom!zebra!vern
3975 W. 29th Ave.					voice: 303-477-1780
Denver, Colo., 80212					 uucp: 303-455-2670les@chinet.chi.il.us (Leslie Mikesell) (01/10/89)
In article <137@zebra.UUCP> vern@zebra.UUCP (Vernon C. Hoxie) writes: > > I have been trying to write a test program for a Trailblazer. >It is connected to /dev/tty000. The program opens this file with: > > fd = open("/dev/tty000", O_RDWR | O_NDELAY); You probably need to use fcntl() to turn off the O_NDELAY before trying to use the port (set CLOCAL first if you need it). Write()s don't wait for the hardware to be ready if you leave O_NDELAY set and strange things happen. I have seen code that indicated that a close(open(/dev/ttywhatever,2) was needed to force the mode to changed. Does anyone know which versions of unix require this? Les Mikesell
michael@stb.UUCP (Michael) (02/08/89)
In article <7411@chinet.chi.il.us> les@chinet.chi.il.us (Leslie Mikesell) writes: >In article <137@zebra.UUCP> vern@zebra.UUCP (Vernon C. Hoxie) writes: >> >> I have been trying to write a test program for a Trailblazer. >>It is connected to /dev/tty000. The program opens this file with: >> >> fd = open("/dev/tty000", O_RDWR | O_NDELAY); > >You probably need to use fcntl() to turn off the O_NDELAY before >trying to use the port (set CLOCAL first if you need it). Write()s >don't wait for the hardware to be ready if you leave O_NDELAY >set and strange things happen. I have seen code that indicated that >a close(open(/dev/ttywhatever,2) was needed to force the mode to >changed. Does anyone know which versions of unix require this? > >Les Mikesell Does anyone know how to turn ON NDELAY for an already open file? Michael : --- : Michael Gersten uunet.uu.net!stb!michael : crash!gryphon!denwa!stb!michael : Coff Coff <=== Stop smoking.
ditto@cbmvax.UUCP (Michael "Ford" Ditto) (02/09/89)
In article <10652@stb.UUCP> michael@stb.UUCP (Michael) writes: >Does anyone know how to turn ON NDELAY for an already open file? Use fcntl(2): int oldmode = fcntl(fd, F_GETFL); if (oldmode == -1) perror("fcntl(F_GETFL)"); else if (fcntl(fd, F_SETFL, oldmode|O_NDELAY) == -1) perror("fcntl(F_SETFL)"); Or, if you're not a fan of error checking: fcntl(fd, F_SETFL, fcntl(fd, F_GETFL)|O_NDELAY); -- -=] Ford [=- "The number of Unix installations (In Real Life: Mike Ditto) has grown to 10, with more expected." ford@kenobi.cts.com - The Unix Programmer's Manual, ...!sdcsvax!crash!elgar!ford 2nd Edition, June, 1972. ditto@cbmvax.commodore.com
lenny@icus.islp.ny.us (Lenny Tropiano) (02/10/89)
In article <10652@stb.UUCP> michael@stb.UUCP (Michael) writes: |>In article <7411@chinet.chi.il.us> les@chinet.chi.il.us (Leslie Mikesell) writes: |>>In article <137@zebra.UUCP> vern@zebra.UUCP (Vernon C. Hoxie) writes: |>>> |>>> I have been trying to write a test program for a Trailblazer. |>>>It is connected to /dev/tty000. The program opens this file with: |>>> |>>> fd = open("/dev/tty000", O_RDWR | O_NDELAY); |>> |>>You probably need to use fcntl() to turn off the O_NDELAY before ... |> |>Does anyone know how to turn ON NDELAY for an already open file? |> Michael ... Use the fcntl(2) system call. #include <fcntl.h> int oflags; /* assume a file descriptor (fd) is already open and in use */ ... fcntl(fd, F_GETFL, &oflags); /* get the current open flags */ /* set the flags to have O_NDELAY too */ fcntl(fd, F_SETFL, oflags | O_NDELAY); I assume that would do it for ya... -Lenny -- Lenny Tropiano ICUS Software Systems [w] +1 (516) 582-5525 lenny@icus.islp.ny.us Telex; 154232428 ICUS [h] +1 (516) 968-8576 {talcott,decuac,boulder,hombre,pacbell,sbcs}!icus!lenny attmail!icus!lenny ICUS Software Systems -- PO Box 1; Islip Terrace, NY 11752
lenny@icus.islp.ny.us (Lenny Tropiano) (02/10/89)
In article <599@icus.islp.ny.us> lenny@icus.islp.ny.us (Lenny Tropiano) writes: |> |>Use the fcntl(2) system call. |> |>#include <fcntl.h> |> |>int oflags; |> |> /* assume a file descriptor (fd) is already open and in use */ |> ... |> fcntl(fd, F_GETFL, &oflags); /* get the current open flags */ |> /* set the flags to have O_NDELAY too */ |> fcntl(fd, F_SETFL, oflags | O_NDELAY); |> |>I assume that would do it for ya... |> I guess next time I should look in the manual first. It's been a while since I did fcntl, and the "DIAGNOSTICS" section of the manual page fcntl(2) says that the return value of F_GETFL is the file flags. Therefore there is *no* argument ... Thanks Mike, you enlightened me again :-) oflags = fcntl(fd, F_GETFL); if (oflags != -1) fcntl(fd, F_SETFL, oflags | O_NDELAY); -Lenny -- Lenny Tropiano ICUS Software Systems [w] +1 (516) 582-5525 lenny@icus.islp.ny.us Telex; 154232428 ICUS [h] +1 (516) 968-8576 {talcott,decuac,boulder,hombre,pacbell,sbcs}!icus!lenny attmail!icus!lenny ICUS Software Systems -- PO Box 1; Islip Terrace, NY 11752