private void SendReceiveAsyncReadComplete(IAsyncResult ar) { SendReceiveAsyncState state = (SendReceiveAsyncState)ar.AsyncState; int bytes = state.dst.EndRead(ar); if (bytes != 0) { state.rcv += bytes; if (state.rcv < state.recvBuf.Length) { Console.WriteLine("Begin Receive: Offset=" + state.rcv + "; Count=" + (state.recvBuf.Length - state.rcv)); state.dst.BeginRead(state.recvBuf, state.rcv, state.recvBuf.Length - state.rcv, SendReceiveAsyncReadComplete, state); } else { state.finished.Set(); Assert.Fail("Received more data than expected"); } } else { if (state.rcv != state.sendBuf.Length) { state.finished.Set(); Assert.Fail("Received more/less data than expected: {0} expected; {1} received", state.sendBuf.Length, state.rcv); } state.finished.Set(); } }
public void SendReceiveWithBeginEnd() { using (SerialPortStream src = new SerialPortStream(SourcePort, 115200, 8, Parity.None, StopBits.One)) using (SerialPortStream dst = new SerialPortStream(DestPort, 115200, 8, Parity.None, StopBits.One)) { src.WriteTimeout = TimeOut; src.ReadTimeout = TimeOut; dst.WriteTimeout = TimeOut; dst.ReadTimeout = TimeOut; src.Open(); Assert.That(src.IsOpen, Is.True); dst.Open(); Assert.That(dst.IsOpen, Is.True); SendReceiveAsyncState state = new SendReceiveAsyncState { src = src, dst = dst, sendBuf = new byte[src.WriteBufferSize], recvBuf = new byte[src.WriteBufferSize + 10] }; Random r = new Random(); r.NextBytes(state.sendBuf); // Here we start the read and write in parallel. The read will wait up to c_Timeout for the first byte. dst.BeginRead(state.recvBuf, 0, state.recvBuf.Length, SendReceiveAsyncReadComplete, state); src.BeginWrite(state.sendBuf, 0, state.sendBuf.Length, SendReceiveAsyncWriteComplete, state); if (!state.finished.WaitOne(30000)) { Assert.Fail("BeginWrite/BeginRead test case timeout"); } } }
private void SendReceiveAsyncWriteComplete(IAsyncResult ar) { SendReceiveAsyncState state = (SendReceiveAsyncState)ar.AsyncState; state.src.EndWrite(ar); }