Exemplo n.º 1
0
        static async Task RunCanLoopAsync(CancellationToken cancellationToken)
        {
            var factory = new SocketCanFactory();

            var incomingBuffer = new byte[16];
            var incomingFrame  = new CanFrame();

            using (var socket = factory.CreateSocket("can0"))
            {
                while (true)
                {
                    await socket.ReceiveAsync(incomingBuffer, SocketFlags.None, CancellationToken.None).ConfigureAwait(false);

                    incomingFrame.Reinitialize(incomingBuffer);

                    try
                    {
                        await socket.SendAsync(new CanFrame { IsExtendedFrame = true, Id = incomingFrame.Id - 1, DataLength = 4 }.FrameBytes, SocketFlags.None).ConfigureAwait(false);
                    }
                    catch (SocketException se) when(se.SocketErrorCode == SocketError.NoBufferSpaceAvailable)
                    {
                        Console.WriteLine("No buffer space available waiting a few ms");
                        await Task.Delay(TimeSpan.FromMilliseconds(10), cancellationToken).ConfigureAwait(false);
                    }
                }
            }
        }
Exemplo n.º 2
0
        static async Task SimpleLoopBackAsync(string adapter, CancellationToken cancellationToken)
        {
            var factory        = new SocketCanFactory();
            var incomingBuffer = new byte[CanFrame.FrameLength];

            using var socket = factory.CreateSocket(adapter);
            {
                Console.WriteLine($"Created adapter: {adapter}");

                while (true)
                {
                    await socket.ReceiveAsync(incomingBuffer, SocketFlags.None, CancellationToken.None).ConfigureAwait(false);

                    var incomingFrame = new CanFrame(incomingBuffer);
                    Console.WriteLine($"Received {nameof(CanFrame)} Id: {incomingFrame.Id} IsRtr: {incomingFrame.IsRemoteTransmissionRequest} Length: {incomingFrame.DataLength} IsError: {incomingFrame.IsErrorMessage} Data: {ByteArrayToString(incomingFrame.Data)}");

                    try
                    {
                        var sendFrame = new CanFrame {
                            IsExtendedFrame = true, Id = incomingFrame.Id - 1, DataLength = 4
                        };

                        sendFrame.Data[0] = 1;
                        sendFrame.Data[1] = 2;
                        sendFrame.Data[2] = 3;
                        sendFrame.Data[3] = 4;

                        await socket.SendAsync(sendFrame.FrameBytes, SocketFlags.None).ConfigureAwait(false);
                    }
                    catch (SocketException se) when(se.SocketErrorCode == SocketError.NoBufferSpaceAvailable)
                    {
                        // Default the buffer space is only 10 message you can extend this on Linux or wait a while before retransmitting.
                        // RUN: "ip link set can0 txqueuelen 1000" to increase size to 1000 messages where can0 is the name of the SocketCAN interface in Linux

                        Console.WriteLine("No buffer space available waiting a few ms");
                        await Task.Delay(TimeSpan.FromMilliseconds(10), cancellationToken).ConfigureAwait(false);
                    }
                }
            }
        }