Naveen

Naveen

  • 1.6k
  • 158
  • 11.2k

How to read channel2 candata and write in channel3.

Jan 23 2024 8:25 AM

How to read channel2 candata and write in channel3.I am configuring 2 handles but handlewrite value is getting 1 but it needs to be 0.How we can solve this. please look  at my below code.

Thanks!

using System;
using canlibCLSNET;
using System.Threading;

namespace CanData06
{
    class Program
    {
        private static int HexConvert(string z)
        {
            int m = Convert.ToInt32(z, 2);
            return m;
        }
        private static void DumpMessageLoop(int handleRead, int handleWrite)
        {
            Canlib.canStatus status;
            bool finished = false;
            byte[] data = new byte[8];

            int id;
            int dlc;
            int flags;
            long timestamp;
           
            Console.WriteLine("Channel opened. Press Escape to close. ");
            Console.WriteLine("ID  DLC DATA                             Timestamp");

            while (!finished)
            {
                status = Canlib.canReadWait(handleRead, out id, data, out dlc, out flags, out timestamp, 100);

                //Console.WriteLine(id);

                string idBinary = Convert.ToString(id, 2).PadLeft(29, '0');
                //Console.WriteLine(idBinary);

                string hex1 = idBinary.Substring(0, 3);
                string hex2 = idBinary.Substring(3, 18);
                string hex3 = idBinary.Substring(21, 8);
                //Console.WriteLine("{0}     {1}      {2}",hex1,hex2,hex3);

                int h1 = HexConvert(hex1);
                int h2 = HexConvert(hex2);
                int h3 = HexConvert(hex3);
                //Console.WriteLine("{0}     {1}      {2}", h1, h2, h3);

                int combinedID = (h1 << 26) | (h2 << 8) | (h3);
                //Console.WriteLine(combinedID);

                status = Canlib.canWrite(handleWrite, combinedID, data, data.Length, Canlib.canMSG_EXT);

                CheckStatus(status, "canWrite");
                Thread.Sleep(10);
            }
        }
        static void Main(string[] args)
        {
            // Holds a handle to the CAN channel
            int handleRead;
            int handleWrite;

            // Status returned by the Canlib calls
            Canlib.canStatus status;

            // The CANlib channel number we would like to use
            int channelNumber1 = 2;
            int channelNumber2 = 3;

            Console.WriteLine("Initializing Canlib");

            // Initialize the Canlib library with a call to
            // Canlib.initializeLibrary(). This always needs to be done before
            // doing anything with the library.
            Canlib.canInitializeLibrary();

            handleRead = Canlib.canOpenChannel(channelNumber1, Canlib.canOPEN_ACCEPT_VIRTUAL);
            CheckStatus((Canlib.canStatus)handleRead, "canOpenChannel(Read)");

            status = Canlib.canSetBusParams(handleRead, Canlib.canBITRATE_250K | Canlib.canOPEN_REQUIRE_EXTENDED, 0, 0, 0, 0, 0);
            CheckStatus(status, "canSetBusParams(Read)");

            handleWrite = Canlib.canOpenChannel(channelNumber2, Canlib.canOPEN_ACCEPT_VIRTUAL);
            CheckStatus((Canlib.canStatus)handleWrite, "canOpenChannel(Write)");
           
            // Once we have successfully opened a channel, we need to set its bitrate. We
            // do this using canSetBusParams. CANlib provides a set of predefined bus parameter
            // settings in the form of canBITRATE_XXX constants. For other desired bus speeds
            // bus paramters have to be set manually.
            // See CANlib documentation for more information on parameter settings.
           
            status = Canlib.canSetBusParams(handleWrite, Canlib.canBITRATE_250K | Canlib.canOPEN_REQUIRE_EXTENDED, 0, 0, 0, 0, 0);
            CheckStatus(status, "canSetBusParams(Write)");

            // Next, take the channel on bus using the canBusOn method. This
            // needs to be done before we can send a message.
            status = Canlib.canBusOn(handleRead);
            CheckStatus(status, "canBusOn(Read)");

            status = Canlib.canBusOn(handleWrite);
            CheckStatus(status, "canBusOn(Write");

            DumpMessageLoop(handleRead,handleWrite);
        }
        // The check method takes a canStatus (which is an enumerable) and the method
        // name as a string argument. If the status is an error code, it will print it.
        // Most Canlib method return a status, and checking it with a method like this
        // is a useful practice to avoid code duplication.
        private static void CheckStatus(Canlib.canStatus status, string method)
        {
            if (status < 0)
            {
                string errorText;
                Canlib.canGetErrorText(status, out errorText);
                Console.WriteLine(method + " failed: " + errorText);
            }

        }
    }
}


Answers (2)