Exemplo n.º 1
0
        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");
            }
        }
Exemplo n.º 2
0
        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
                }
            }
        }