Example #1
0
        /// <summary>
        /// 根据ID号读取相应传感器的数值
        /// </summary>
        /// <param name="id">输入所要读取的ID号</param>
        /// <returns></returns>
        public LIN_STP318_ReadData ReadData_STP318(int DevHandle, byte id)
        {
            int ret;
            LIN_STP318_ReadData rd_msg = new LIN_STP318_ReadData();

            USB2LIN.LIN_MSG[] msg = new USB2LIN.LIN_MSG[1];
            msg[0].Data    = new Byte[9];
            msg[0].DataLen = 3;
            msg[0].ID      = id;

            IntPtr[] ptArray = new IntPtr[1];
            ptArray[0] = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(USB2LIN.LIN_MSG)) * msg.Length);
            IntPtr pt = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(USB2LIN.LIN_MSG)));

            Marshal.Copy(ptArray, 0, pt, 1);
            //将数组中的数据拷贝到指针所指区域
            for (int k = 0; k < msg.Length; k++)
            {
                Marshal.StructureToPtr(msg[k], (IntPtr)((UInt32)pt + k * Marshal.SizeOf(typeof(USB2LIN.LIN_MSG))), true);
            }

            ret = USB2LIN.LIN_Read(DevHandle, LINIndex, pt, 1);
            if (ret < USB2LIN.LIN_SUCCESS)
            {
                Console.WriteLine("LIN read data failed!\n");
                return(rd_msg);
            }
            else
            {
                msg[0]        = (USB2LIN.LIN_MSG)Marshal.PtrToStructure((IntPtr)((UInt32)pt + 0 * Marshal.SizeOf(typeof(USB2LIN.LIN_MSG))), typeof(USB2LIN.LIN_MSG));
                rd_msg.TOF    = BitConverter.ToUInt16(msg[0].Data, 0);
                rd_msg.status = msg[0].Data[2];
                return(rd_msg);
            }
        }
Example #2
0
        /// <summary>
        /// 根据ID号读取相应传感器的数值,一次读取一组数值
        /// </summary>
        /// <param name="id">输入所要读取的ID号</param>
        /// <returns></returns>
        public void STP318_ReadDatas(int DevHandle, byte FrameLenght, byte[] id, ref LIN_STP318_ReadData[] m_stp318datas)
        {
            int ret;

            USB2LIN.LIN_MSG[] msg = new USB2LIN.LIN_MSG[FrameLenght];
            for (int i = 0; i < FrameLenght; i++)
            {
                msg[0].Data    = new Byte[9];
                msg[0].DataLen = 3;
                msg[0].ID      = id[i];
            }

            IntPtr[] ptArray = new IntPtr[FrameLenght];
            for (int i = 0; i < FrameLenght; i++)
            {
                ptArray[i] = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(USB2LIN.LIN_MSG)) * msg.Length);
            }

            IntPtr pt = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(USB2LIN.LIN_MSG)) * msg.Length);

            Marshal.Copy(ptArray, 0, pt, FrameLenght);
            ////将数组中的数据拷贝到指针所指区域
            for (int k = 0; k < msg.Length; k++)
            {
                Marshal.StructureToPtr(msg[k], (IntPtr)((UInt32)pt + k * Marshal.SizeOf(typeof(USB2LIN.LIN_MSG))), true);
            }

            ret = USB2LIN.LIN_Read(DevHandle, LINIndex, pt, FrameLenght);
            if (ret < USB2LIN.LIN_SUCCESS)
            {
                Console.WriteLine("LIN read data failed!\n");
                //return rd_msg;
            }
            else
            {
                //msg[0] = (USB2LIN.LIN_MSG)Marshal.PtrToStructure((IntPtr)((UInt32)pt + 0 * Marshal.SizeOf(typeof(USB2LIN.LIN_MSG))), typeof(USB2LIN.LIN_MSG));
                //msg[1] = (USB2LIN.LIN_MSG)Marshal.PtrToStructure((IntPtr)((UInt32)pt + 1 * Marshal.SizeOf(typeof(USB2LIN.LIN_MSG))), typeof(USB2LIN.LIN_MSG));
                //rd_msg.TOF = BitConverter.ToUInt16(msg[0].Data, 0);
                //rd_msg.status = msg[0].Data[2];
                //return rd_msg;
            }
        }
Example #3
0
        static void Main(string[] args)
        {
            usb_device.DEVICE_INFO DevInfo = new usb_device.DEVICE_INFO();
            Int32[] DevHandles             = new Int32[20];
            Int32   DevHandle = 0;
            Byte    LINIndex  = 0;
            bool    state;
            Int32   DevNum, ret;

            //扫描查找设备
            DevNum = usb_device.USB_ScanDevice(DevHandles);
            if (DevNum <= 0)
            {
                Console.WriteLine("No device connected!");
                return;
            }
            else
            {
                Console.WriteLine("Have {0} device connected!", DevNum);
            }
            DevHandle = DevHandles[0];
            //打开设备
            state = usb_device.USB_OpenDevice(DevHandle);
            if (!state)
            {
                Console.WriteLine("Open device error!");
                return;
            }
            else
            {
                Console.WriteLine("Open device success!");
            }
            //获取固件信息
            StringBuilder FuncStr = new StringBuilder(256);

            state = usb_device.DEV_GetDeviceInfo(DevHandle, ref DevInfo, FuncStr);
            if (!state)
            {
                Console.WriteLine("Get device infomation error!");
                return;
            }
            else
            {
                Console.WriteLine("Firmware Info:");
                Console.WriteLine("    Name:" + Encoding.Default.GetString(DevInfo.FirmwareName));
                Console.WriteLine("    Build Date:" + Encoding.Default.GetString(DevInfo.BuildDate));
                Console.WriteLine("    Firmware Version:v{0}.{1}.{2}", (DevInfo.FirmwareVersion >> 24) & 0xFF, (DevInfo.FirmwareVersion >> 16) & 0xFF, DevInfo.FirmwareVersion & 0xFFFF);
                Console.WriteLine("    Hardware Version:v{0}.{1}.{2}", (DevInfo.HardwareVersion >> 24) & 0xFF, (DevInfo.HardwareVersion >> 16) & 0xFF, DevInfo.HardwareVersion & 0xFFFF);
                Console.WriteLine("    Functions:" + DevInfo.Functions.ToString("X8"));
                Console.WriteLine("    Functions String:" + FuncStr);
            }
            //初始化配置LIN
            USB2LIN.LIN_CONFIG LINConfig = new USB2LIN.LIN_CONFIG();
            LINConfig.BaudRate  = 19200;
            LINConfig.BreakBits = USB2LIN.LIN_BREAK_BITS_11;
            LINConfig.CheckMode = USB2LIN.LIN_CHECK_MODE_EXT;
#if LIN_MASTER
            LINConfig.MasterMode = USB2LIN.LIN_MASTER;
#else
            LINConfig.MasterMode = USB2LIN.LIN_SLAVE;
#endif
            ret = USB2LIN.LIN_Init(DevHandle, LINIndex, ref LINConfig);
            if (ret != USB2LIN.LIN_SUCCESS)
            {
                Console.WriteLine("Config LIN failed!");
                return;
            }
            else
            {
                Console.WriteLine("Config LIN Success!");
            }
#if LIN_MASTER
            //主机写数据
            for (Byte ID = 0; ID < 10; ID++)
            {
                USB2LIN.LIN_MSG[] msg = new USB2LIN.LIN_MSG[1];
                msg[0].Data = new Byte[9];
                for (Byte i = 0; i < 8; i++)
                {
                    msg[0].Data[i] = (Byte)(ID + i);
                }
                msg[0].DataLen = 8;
                msg[0].ID      = ID;
                ret            = USB2LIN.LIN_Write(DevHandle, LINIndex, msg, 1);
                if (ret != USB2LIN.LIN_SUCCESS)
                {
                    Console.WriteLine("LIN write data failed!\n");
                    return;
                }
                else
                {
                    Console.WriteLine("LIN write data success!\n");
                }
                //延时
                System.Threading.Thread.Sleep(10);
            }
            //主机读数据
            for (Byte ID = 0; ID < 10; ID++)
            {
                USB2LIN.LIN_MSG[] msg = new USB2LIN.LIN_MSG[1];
                msg[0].Data = new Byte[9];
                msg[0].ID   = ID;

                IntPtr[] ptArray = new IntPtr[1];
                ptArray[0] = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(USB2LIN.LIN_MSG)) * msg.Length);
                IntPtr pt = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(USB2LIN.LIN_MSG)));
                Marshal.Copy(ptArray, 0, pt, 1);
                //将数组中的数据拷贝到指针所指区域
                for (int k = 0; k < msg.Length; k++)
                {
                    Marshal.StructureToPtr(msg[k], (IntPtr)((UInt32)pt + k * Marshal.SizeOf(typeof(USB2LIN.LIN_MSG))), true);
                }

                ret = USB2LIN.LIN_Read(DevHandle, LINIndex, pt, 1);
                if (ret < USB2LIN.LIN_SUCCESS)
                {
                    Console.WriteLine("LIN read data failed!\n");
                    return;
                }
                else
                {
                    msg[0] = (USB2LIN.LIN_MSG)Marshal.PtrToStructure((IntPtr)((UInt32)pt + 0 * Marshal.SizeOf(typeof(USB2LIN.LIN_MSG))), typeof(USB2LIN.LIN_MSG));
                    Console.Write("Master LIN Read: ID = 0x{0:X2} Data = ", msg[0].ID);
                    for (int i = 0; i < msg[0].DataLen; i++)
                    {
                        Console.Write("0x{0:X2} ", msg[0].Data[i]);
                    }
                    Console.WriteLine("");
                }
            }
#else
            //设置从机模式下所有ID都为从接收数据模式,这样就可以获取到主机发送过来的所有数据,初始化配置为从机后,默认所有ID都为接收数据模式,所以若是监听LIN总线数据,这个函数可以不用调用
            USB2LIN.LIN_MSG[] LINSlaveData = new USB2LIN.LIN_MSG[64];
            for (Byte i = 0; i < 64; i++)
            {
                LINSlaveData[i]         = new USB2LIN.LIN_MSG();
                LINSlaveData[i].DataLen = 9;        //最大8Byte数据+1Byte和校验
                LINSlaveData[i].ID      = i;        //ID值
                LINSlaveData[i].Data    = new Byte[9];
            }
            ret = USB2LIN.LIN_SlaveSetIDMode(DevHandle, LINIndex, USB2LIN.LIN_SLAVE_READ, LINSlaveData, 64);
            if (ret != USB2LIN.LIN_SUCCESS)
            {
                Console.WriteLine("Set LIN operation mode failed!");
                return;
            }
            else
            {
                Console.WriteLine("Set LIN operation mode success!");
            }
            //从机接收数据,若要连续不断的监控LIN总线数据,可以循环调用LIN_SlaveGetData函数
            USB2LIN.LIN_MSG[] LINSlaveDataBuffer = new USB2LIN.LIN_MSG[1024];//为了防止缓冲区溢出,可以将接收数据缓冲区设置大一点
            for (int i = 0; i < LINSlaveDataBuffer.Length; i++)
            {
                LINSlaveDataBuffer[i]      = new USB2LIN.LIN_MSG();
                LINSlaveDataBuffer[i].Data = new Byte[9];
            }
            while (true)
            {
                IntPtr[] ptArray = new IntPtr[2];
                ptArray[0] = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(USB2LIN.LIN_MSG)) * LINSlaveDataBuffer.Length);
                IntPtr pt = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(USB2LIN.LIN_MSG)));
                Marshal.Copy(ptArray, 0, pt, 1);
                ret = USB2LIN.LIN_SlaveGetData(DevHandle, LINIndex, pt);
                if (ret < USB2LIN.LIN_SUCCESS)
                {
                    Console.WriteLine("LIN slave read data error!");
                    return;
                }
                else if (ret == 0)
                {
                    //Console.WriteLine("LIN slave read no data!");
                }
                else
                {
                    Console.WriteLine("LIN slave read data:");
                    for (int i = 0; i < ret; i++)
                    {
                        LINSlaveDataBuffer[i] = (USB2LIN.LIN_MSG)Marshal.PtrToStructure((IntPtr)((UInt32)pt + i * Marshal.SizeOf(typeof(USB2LIN.LIN_MSG))), typeof(USB2LIN.LIN_MSG));
                        Console.Write("Data[{0}]: ", i);
                        Console.Write("ID = 0x{0:X2} ", LINSlaveDataBuffer[i].ID);
                        Console.Write("Data = ");
                        for (int j = 0; j < LINSlaveDataBuffer[i].DataLen; j++)
                        {
                            Console.Write("0x{0:X2} ", LINSlaveDataBuffer[i].Data[j]);
                        }
                        Console.WriteLine("");
                    }
                }
                //延时
                System.Threading.Thread.Sleep(10);
            }
#endif
        }