Here are three more ideas: use flow control, the Timer() function, or an asynchronous timer.
Do you have any control over the embedded application? Can you implement either hardware or software (XON/XOFF) flow control?
To make sure you have a minimum delay, you could use the Timer function after your Delay function call. That will help you avoid a delay that's too short, but not one that's too long.
An asynchronous timer may help, since the timer runs in a different thread (but its callback is still affected by some windows stuff). In CVI 6.0, the general help for asynchronous timer is under "Asychronous" (misspelled). There is also an async timer example that ships with CVI (found in the CVI help under "Asynchronous" correctly spelled).
Call NewAsyncTimer to start
the timer and assign a callback function.
Call SetAsyncTimerAttribute to set the timer interval to 5 mS.
Use a global flag with three states: e.g.: 0 = waiting after new transmission; 1 = waiting, timer event received; 2 = ready for new transmission.
Immediately after transmitting, set flag = 0.
In the timer callback, increment the flag. On the first callback, flag will be incremented to 1.
In the main routine, run a loop waiting for flag >= 2.
In the next timer callback (5 mS later), flag will be incremented to 2.
In your main routine, when the flag >= 2, set the flag=0 and continue.