I've only used synpase and later LazSynaSer but as a hardware man, an async port means independent send and read operations.
unless DataPort offers you some thing I sugest you look at using hardware handshaking (RTS/CTS) setting it before you send something and clear it when done (which is harder due to buffering). RTS/CTS are more like suggestions, allowing a few more bytes to be sent before pausing. Event the UART chips back in the 80s had an internal 15 byte buffer.
LazSynaSer does include .OnEndOfBlock and .onShowStatus call backs that allow access to some low level OS event reporting, but I believe this will be Driver dependent.
Most VCP come with buffers several hundred bytes big that you may be trying to degrade. a USB<=>bridge driver will wait until (timeout or byte count) before it passes the stream to it's device using a USB block transfer. You may be forced to sent one byte at a time at a low baud rate in order to bypass these OS driver buffers.
hope this post helps. MAS