On Sun, 09 Sep 2018 16:26:29 +0200, Bo Berglund via Lazarus
<lazarus@lists.lazarus-ide.org> wrote:

>On Sun, 09 Sep 2018 13:33:22 +0200, Bo Berglund via Lazarus
><lazarus@lists.lazarus-ide.org> wrote:
>
>>3) Receiving data
>>----------------
>I forgot to add a question about read timeouts...
>
>4) Read timeout
>---------------
>When running this to read incoming data:
>
>status:= SerRead(serialhandle, s[1], 10);
>
>How can I get out of the call if there never arrives 10 bytes? Is
>there a timeout somewhere so that I can set it to some small value and
>put the SerRead into a thread that can check arriving data and if
>found fire off an event or such?

Ok, I went to the sources and found this:

interface
...
{ Reads a maximum of "Count" bytes of data into the specified buffer.
  Result: Number of bytes read. }
function SerRead(Handle: TSerialHandle; var Buffer; Count: LongInt):
LongInt;

implementation
...
function SerRead(Handle: TSerialHandle; var Buffer; Count: LongInt):
LongInt;
var
  BytesRead: DWORD;
  Timeouts: TCommTimeouts;
begin
  if GetCommTimeouts(Handle, Timeouts) then 
  begin
    Timeouts.ReadIntervalTimeout := MAXDWORD;
    Timeouts.ReadTotalTimeoutConstant := 0;
    SetCommTimeouts(Handle, Timeouts)
  end;
  if not ReadFile(Handle, Buffer, Count, BytesRead, nil) then
    result := 0
  else
    result := BytesRead
end { SerRead } ;

So SerRead seems to read *up to* Count bytes, but does it do this by
checking what is currently stored in the operating system inbound
buffer or does it try to wait until Count bytes are available?

If so how is the timeout that is needed in such a case changed?
Seems to be set at infinity in the SerRead function (MAXDWORD)....
Or is it ReadTotalTimeoutConstant that is used during read?

If you drill further down you will get into ReadFile, but that is a
call into Windows API...


-- 
Bo Berglund
Developer in Sweden

-- 
_______________________________________________
Lazarus mailing list
Lazarus@lists.lazarus-ide.org
https://lists.lazarus-ide.org/listinfo/lazarus

Reply via email to