Sérgio Neves
Published © MIT

nanoFramework CAN demo

This project illustrate how simple is to use nanoFramework to send and receive messages over a CAN bus.

BeginnerProtip30 minutes1,461
nanoFramework CAN demo

Things used in this project

Hardware components

STMicroelectronics STM32F4DISCOVERY
×1
Breadboard (generic)
Breadboard (generic)
×1
1N4148 – General Purpose Fast Switching
1N4148 – General Purpose Fast Switching
×2
Resistor 3.3k ohm
×1
Jumper wires (generic)
Jumper wires (generic)
×1

Software apps and online services

Visual Studio extension
.NET nanoFramework Visual Studio extension
nanoFramework.Devices.Can
.NET nanoFramework nanoFramework.Devices.Can
nanoFramework.Windows.Devices.Gpio
.NET nanoFramework nanoFramework.Windows.Devices.Gpio
Microsoft Visual Studio 2017

Story

Read more

Schematics

CAN bus schematic

Code

C# sample app

C#
using nanoFramework.Devices.Can;
using System;
using System.Threading;
using Windows.Devices.Gpio;

namespace Can.TestApp
{
    public class Program
    {
        static GpioPin _led;

        static CanController CanController1;
        static CanController CanController2;
        public static void Main()
        {
            // PD13 is LED3 in DISCOVERY4
            _led = GpioController.GetDefault().OpenPin(PinNumber('D', 13));
            _led.SetDriveMode(GpioPinDriveMode.Output);

            // set settings for CAN controller
            CanSettings canSettings = new CanSettings(6, 8, 1, 0);

            // get controller for CAN1
            CanController1 = CanController.FromId("CAN1", canSettings);
            // get controller for CAN2
            CanController2 = CanController.FromId("CAN2", canSettings);

            //CanController1.MessageReceived += CanController_DataReceived;
            CanController2.MessageReceived += CanController_DataReceived;

            while (true)
            {
                CanController1.WriteMessage(new CanMessage(0x01234567, CanMessageIdType.EID, CanMessageFrameType.Data, new byte[] { 0xCA, 0xFE }));

                Thread.Sleep(2000);
            }
        }

        private static void CanController_DataReceived(object sender, CanMessageReceivedEventArgs e)
        {
            CanController canCtl = (CanController)sender;

            while (true)
            {
                // try get the next message
                var msg = canCtl.GetMessage();
 
                if(msg == null)
                {
                    Console.WriteLine("*** No more message available!!!");
                    break;
                }

                // new message available, output message
                if (msg.Message != null)
                {
                    Console.Write($"Message on {canCtl.ControllerId}: ");
                    for (int i = 0; i < msg.Message.Length; i++)
                    {
                        Console.Write(msg.Message[i].ToString("X2"));
                    }

                    new Thread(BlinkLED).Start();
                }
                Console.WriteLine("");
            }
        }

        static void BlinkLED()
        {
            // blink led for each message received
            _led.Write(GpioPinValue.High);
            Thread.Sleep(500);
            _led.Toggle();
        }

        static int PinNumber(char port, byte pin)
        {
            if (port < 'A' || port > 'J')
                throw new ArgumentException();

            return ((port - 'A') * 16) + pin;
        }
    }
}

CAN sample

Credits

Sérgio Neves

Sérgio Neves

1 project • 1 follower

Comments