Пример #1
0
        private async Task _GetBytes(Registers.reg registerAddress, uint length)
        {
            if ((packets / 1000) > 0 || (timeouts / 1000) > 0)
            {
                packets  = packets / 4;
                timeouts = timeouts / 4;
            }
            packets++;

            var l       = 4;
            var payload = new byte[l];

            payload[0] = 0xAA;             // Start Byte
            payload[1] = 0x01;             // Read
            payload[2] = (byte)((byte)registerAddress & 0xFF);
            payload[3] = (byte)(length & 0xFF);

            await Task.Run(() =>
            {
                bool passed = false;
                int r       = 0;
                while (!passed && r <= retryMax)
                {
                    try
                    {
                        port.DiscardInBuffer();
                        port.Write(payload, 0, l);

                        for (int i = 0; i < length + 2; i++)
                        {
                            i2cBuffer[i] = (byte)port.ReadByte();
                        }
                        passed = true;
                    }
                    catch (TimeoutException)
                    {
                        r++;
                        timeouts++;
                    }
                }

                if (!passed)
                {
                    throw new Exception("Retried exceeded, request timed out");
                }

                if (i2cBuffer[0] != 0xBB)
                {
                    throw new Exception("Register read error - byte[0] != 0xBB");
                }
            });
        }
Пример #2
0
        private async Task _SetBytes(Registers.reg registerAddress, byte[] values, bool noAck = false)
        {
            if ((packets / 1000) > 0 || (timeouts / 1000) > 0)
            {
                packets  = packets / 4;
                timeouts = timeouts / 4;
            }
            packets++;

            var l       = 4 + values.Length;
            var payload = new byte[l];

            payload[0] = 0xAA;             // Start Byte
            payload[1] = 0x00;             // Write
            payload[2] = (byte)((byte)registerAddress & 0xFF);
            payload[3] = (byte)values.Length;
            var i = 4;

            foreach (var dat in values)
            {
                payload[i] = (byte)(dat & 0xFF);
                i++;
            }
            await Task.Run(() =>
            {
                bool passed = false;
                int r       = 0;
                while (!passed && r <= retryMax)
                {
                    try
                    {
                        port.DiscardInBuffer();
                        port.Write(payload, 0, l);

                        if (noAck)
                        {
                            return;
                        }

                        for (int x = 0; x < 2; x++)
                        {
                            i2cBuffer[x] = (byte)port.ReadByte();
                        }
                        passed = true;
                    }
                    catch (TimeoutException)
                    {
                        r++;
                        timeouts++;
                    }
                }
                if (!passed)
                {
                    throw new Exception("Retries exceeded, request timed out");
                }
                if (i2cBuffer[0] != 0xEE && i2cBuffer[1] != 0x01)
                {
                    throw new Exception("Register write error - byte[0] != 0xEE && byte[1] != 0x01");
                }
            });
        }