Mmmmm, if I were you I'd look at the data arriving at the PIC end, the timing, and when the PIC responds with sending back the received bytes in relation to the time the rest of the transmitted bytes arrive. Ideally if it's expecting 3byte commands, it would wait to receive all 3 bytes, action them, then respond with 3 bytes.
If you want to try send 1byte, get 1 byte, send another byte type approach, best thing is to buffer the incoming data and perhaps use a timer to examine the received data.
With asynchstreams I founf that data doesn't usually arrive together, if I expect 6 bytes I usually get a New_Data event for one byte, then another for 5 bytes. So it is best to buffer the receved data up and work with the buffered data.
I wrote a little class to work as a fifo, I've attached it. No claims from me as to how good the programming is, but it works for me. Include it in your project and initialise it and use it like this:
Sub Process_Globals
Dim rxfifo As cFIFO
Sub Activity_Create(FirstTime As Boolean)
rxfifo.Initialize
Sub AStream_NewData (Buffer() As Byte)
rxfifo.PutManyByte(Buffer)
End Sub
you can check how many bytes there are in the fifo by checking rxfifo.Cnt, and grab them out the fifo one by one with rxfifo.GetByte.
Also be aware that if you have any modal dialog boxes, any code that calls DoEvents, or use the inputList or inputMap functions (which are modal), then these block asynchstreams while they are being displayed.