[fpc-pascal] Question on programming serial communication.
Marc Santhoff
M.Santhoff at t-online.de
Tue Feb 26 01:45:15 CET 2008
Am Montag, den 25.02.2008, 18:13 +0100 schrieb Rainer Hantsch:
> | > I only want to use sme kind of API, Class, Object or set of procedures
> | > which allows me similar things as were possible with the FOSSIL
> | > driver:
> | > - Buffered I/O
> | > - Flow Control as I need (RTS/CTS, XON/XOFF, Both, None)
> | > - Direct Control of control lines like DTR, ...
> | > - Possibilities for monitoring fill level of buffers, to force
> | > them to be erased (made empty), ...
> |
> | In Linux you simply open() the /dev/ttySxx device and then read() and
> | write() to it. This is for data, for other stuff (e.g. flow
> | control, ...) can be done via ioctl() (please excuse the C syntax). But
> | as Horacio already said you probably go better with a wrapper, e.g.
> | Synaser or TSerial (but I didn't use either).
[...]
> As far as I could find out some years ago, the /dev/ttySxx are having no
> buffer.
I think that is a matter of your OS and maybe a question of port
settings, but I'm not really sure. ;)
> --> "BLOCKING" is the magic word which is the problem. :-(
That problem is easily solved. I'm only using serial.pp for reading a
dumb and slow dmm, but in principle (on FreeBSD):
fCom := fpOpen('/dev/cuaa0', O_RDWR OR O_NOCTTY );//OR O_NONBLOCK);
See the commented tail of that line? Linux must have something similar
(IMHO). That way you can switch to the expected behaviour.
After opening some settings need to be done:
tios: termios;
begin
fillchar(tios, sizeof(tios), #0);
tios.c_ispeed := B1200;
tios.c_ospeed := B1200;
tios.c_cflag := CREAD or CLOCAL or CS7 or CSTOPB;
tios.c_oflag := 0;
tios.c_iflag := IGNBRK OR IGNPAR;
tios.c_lflag := 0;
r := tcsetattr(fCom, TCSANOW, tios);
All of that could be done using:
SerSetParams(fCom, 1200, 7, NoneParity, 2, []);
but for me that did not set all I needed, though I don't remember what
was missing.
And for controlling the lines you can do sth. lke:
SerSetRTS(fCom, FALSE);
and the same for other lines. Look into the serial unit and also the
tios unit. On FreeBSD termios(4) has a lot of information (and it states
every line has an input queue aka buffer).
HTH,
Marc
More information about the fpc-pascal
mailing list