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-2670
les@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