internal async Task <byte[]> SendAsync(byte[] buffer, int timeout, CancellationToken token) { var array = new byte[buffer.Count() + 3]; array[0] = 0xAB; array[1] = (byte)buffer.Count(); buffer.CopyTo(array, 2); array[buffer.Count() + 2] = CRCManager.GetCrc(array, 0, buffer.Count() + 2); LogManager.WriteData($"{_serialPort.PortName} Send: ", array); //send packet _serialPort.Write(array, 0, buffer.Count() + 3); var task = WaitAnswerAsync(); //receive packet if (await Task.WhenAny(task, Task.Delay(timeout), token.AsTask()) == task) { var result = await task; tcs = null; return(result); } else { throw new ApplicationException("Packet timeout"); } }
private void ProcessQueue() { while (receiveQueue.Count > 2) { //get marker var marker = receiveQueue.ElementAt(0); if (marker != 0xAB) { receiveQueue.Dequeue(); continue; } //get length var length = receiveQueue.ElementAt(1); if (receiveQueue.Count < length + 3) { return; //wait fully packet } //process packet receiveQueue.Dequeue(); receiveQueue.Dequeue(); byte crc = CRCManager.GetAdditiveCrc(length, 0x8F); var data = new byte[length]; for (int i = 0; i < length; i++) { data[i] = receiveQueue.Dequeue(); } var receivedcrc = receiveQueue.Dequeue(); if (receivedcrc != CRCManager.GetCrc(data, 0, -1, crc)) { LogManager.WriteText("bad crc"); return; } if (tcs != null) { tcs.SetResult(data); } else { //custom packets } } }