[Lazarus] Serial communication??
Mark Morgan Lloyd
markMLl.lazarus at telemetry.co.uk
Fri Oct 1 11:50:05 CEST 2010
Bo Berglund wrote:
> So now I am after a serial comm implementation for Lazarus/Fpc to work
> in a Linux embedded environment which gives me these possibilities.
Yes, and as I've said before I'm using the standard serial unit plus
fpSelect() without problems. Horses for courses, as we say over here.
Irrespective of what solution you choose one thing that you might need
to consider is how accurately you can time things. In particular, the
type of protocol that I work with needs timeouts applied from the point
where the computer has actually sent the final character of a packet, so
whatever code is handling your state machine (or whatever) needs to be
able to see the comms subsystem at that level- not just at an abstracted
event level.
function SerReadTimeout(Handle: TSerialHandle; var Buffer; mSec:
LongInt): LongInt;
(* This is similar to Serial.SerRead() but adds a mSec timeout. Note
that this *)
(* variant returns as soon as a single byte is available, or as dictated
by the *)
(* timeout.
*)
VAR readSet: TFDSet;
selectTimeout: TTimeVal;
begin
fpFD_ZERO(readSet);
fpFD_SET(Handle, readSet);
selectTimeout.tv_sec:= mSec DIV 1000;
selectTimeout.tv_usec:= mSec * 1000;
RESULT:= 0;
IF fpSelect(Handle + 1, @readSet, NIL, NIL, @selectTimeout) > 0 THEN
RESULT:= fpRead(Handle, Buffer, 1)
end { SerReadTimeout } ;
function SerReadTimeout(Handle: TSerialHandle; var Buffer: ARRAY OF
BYTE; count, mSec: LongInt): LongInt;
(* This is similar to Serial.SerRead() but adds a mSec timeout. Note
that this *)
(* variant attempts to accumulate as many bytes as are available, but
does not *)
(* exceed the timeout.
*)
On top of those you put whatever state machines etc. that you need.
--
Mark Morgan Lloyd
markMLl .AT. telemetry.co .DOT. uk
[Opinions above are the author's, not those of his employers or colleagues]
More information about the Lazarus
mailing list