On Mon, 31 Aug 2020 12:01:33 +0200, Bo Berglund via fpc-pascal <fpc-pascal@lists.freepascal.org> wrote:
>Thanks, I was worried about reading more data than specified. >Now I can let the loop in Execute read say 10 bytes or so with timeout >ane process these, then loop back after firing off the event. Just a follow-up for completeness: I have got it running now and I implemented the fpserialport object such tghta if it is commanded to open the port without an event procedure defined it will provide blocking read functions (overloaded for string vs. TBytes containers). But if the event is defined it will read the data in the Execute function in the read thread and provide the data to the user via the event. Here is the read thread code (BUFFERSIZE is set to $2000): TOnRxDataEvent = procedure(Sender: TObject; const Data: TBytes) of object; procedure TComPortReadThread.CallEvent; begin if Assigned(Owner.FOnRxData) then begin Owner.FOnRxData(Owner, FBuffer); end; end; procedure TComPortReadThread.Execute; var Cnt: integer; begin try SetLength(FBuffer, BUFFERSIZE); //Set buffer size to 8192 bytes. while not MustDie do begin cnt := SerReadTimeout(Owner.FHandle, FBuffer[0], 10, 10); //Read 10 bytes with timeout of 10 ms if cnt > 0 then begin SetLength(FBuffer, cnt); //Reduce size to fit rx data Synchronize(CallEvent); //Rx data in FBuffer to caller SetLength(FBuffer, BUFFERSIZE); //Restore buffer size end; end; finally Terminate; end; end; So this will fire the event on every 10 bytes received or after the 10 ms timeout, whichever comes first. No event without data, though. I don't know if this is really OK, my applications are using 38400 and 115200 baud so the 10 bytes will arrive in less than 3 ms at the slower speed. But I could not figure out any better way to implement it, save for firing off the event for every byte arriving, which would cause a lot of calls... Maybe I could tie the timeout to the actual baud used? Slower speeds use longer timeout etc? Timeout could be set to the time it takes to transfer the number of bytes to read? And both arguments could be made properties of the class such that the user can tweak performance a bit? -- Bo Berglund Developer in Sweden _______________________________________________ fpc-pascal maillist - fpc-pascal@lists.freepascal.org https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal