Beispiel #1
0
        /// <summary>
        /// 成功返回非0,失败返回0
        /// </summary>
        /// <returns></returns>
        public unsafe static bool SendData(int len, byte[] buf)
        {
            try
            {
                //如果发送的数据的路数在打开的路数之外,返回false
                if (buf[3] >= m_CanCount)
                {
                    return(false);
                }

                int nMsgCount = (len - 4) / 8;
                if (nMsgCount * 8 + 4 < len)
                {
                    nMsgCount++;
                }

                VCI_CAN_OBJ sendobj = new VCI_CAN_OBJ();
                sendobj.SendType   = (byte)0; //正常发送 单次正常发送 自发自收 单次自发自收
                sendobj.RemoteFlag = (byte)0; //数据帧 远程帧
                sendobj.ExternFlag = (byte)1; //标准帧 扩展帧
                sendobj.DataLen    = 8;
                //Initialize msg
                if (buf[0] == (int)LogInfo.SendDataType.模板选择 ||                 //CMD_TempletList:命令码cmd_code=0x47定义(模板选择)
                    buf[0] == (int)LogInfo.SendDataType.取件单位选择)                 //CMD_UnitList:命令码cmd_code=0xE4定义(取件单位选择)
                {
                    for (int j = 0; j < nMsgCount; j++)
                    {
                        if (j + 1 < nMsgCount)
                        {
                            sendobj.ID = (uint)(buf[1] | (buf[2] << 8) | (buf[3] << 16) | ((0xC0 + j) << 20));
                            System.Runtime.InteropServices.Marshal.Copy(buf, 12 + j * 8, (IntPtr)sendobj.Data, 8);
                        }
                        else
                        {
                            sendobj.ID = (uint)(buf[1] | (buf[2] << 8) | (buf[3] << 16) | (buf[0] << 20));
                            System.Runtime.InteropServices.Marshal.Copy(buf, 4, (IntPtr)sendobj.Data, 8);
                        }
                        //程序更改成循环发送,一直发送直到成功。
                        while (AdvCan.VCI_Transmit(m_devtype, m_devind, buf[3], ref sendobj, 1) == 0 && m_bOpen)
                        {
                            System.Threading.Thread.Sleep(10);
                        }
                    }
                }
                else if (buf[0] == (int)LogInfo.SendDataType.提示文本 || buf[0] == (int)LogInfo.SendDataType.提示文本串口屏幕)                //CMD_OUTTEXT:命令码cmd_code=0x4c定义(在主显示屏上的各个区域显示提示文本)
                {
                    for (int j = 0; j < nMsgCount; j++)
                    {
                        if (j + 1 < nMsgCount)
                        {
                            sendobj.ID = (uint)(buf[1] | (buf[2] << 8) | (buf[3] << 16) | ((0xA0 + j) << 20));
                            System.Runtime.InteropServices.Marshal.Copy(buf, 12 + j * 8, (IntPtr)sendobj.Data, 8);
                        }
                        else
                        {
                            sendobj.ID = (uint)(buf[1] | (buf[2] << 8) | (buf[3] << 16) | (buf[0] << 20));
                            System.Runtime.InteropServices.Marshal.Copy(buf, 4, (IntPtr)(sendobj.Data), 8);
                        }
                        //程序更改成循环发送,一直发送直到成功。
                        while (AdvCan.VCI_Transmit(m_devtype, m_devind, buf[3], ref sendobj, 1) == 0 && m_bOpen)
                        {
                            System.Threading.Thread.Sleep(10);
                        }
                    }
                }
                else if (buf[0] == (int)LogInfo.SendDataType.语音提示)                //CMD_Sound:命令码cmd_code=0x50定义(语音提示)
                {
                    for (int j = 0; j < nMsgCount; j++)
                    {
                        if (j + 1 < nMsgCount)
                        {
                            sendobj.ID = (uint)(buf[1] | (buf[2] << 8) | (buf[3] << 16) | ((0xC0 + j) << 20));
                            System.Runtime.InteropServices.Marshal.Copy(buf, 12 + j * 8, (IntPtr)sendobj.Data, 8);
                        }
                        else
                        {
                            sendobj.ID = (uint)(buf[1] | (buf[2] << 8) | (buf[3] << 16) | (buf[0] << 20));
                            System.Runtime.InteropServices.Marshal.Copy(buf, 4, (IntPtr)sendobj.Data, 8);
                        }
                        //程序更改成循环发送,一直发送直到成功。
                        while (AdvCan.VCI_Transmit(m_devtype, m_devind, buf[3], ref sendobj, 1) == 0 && m_bOpen)
                        {
                            System.Threading.Thread.Sleep(10);
                        }
                    }
                }
                else
                {
                    for (int j = 0; j < nMsgCount; j++)
                    {
                        sendobj.ID = (uint)(buf[1] | (buf[2] << 8) | ((buf[3] & 0xF) << 16) | (buf[0] << 20));
                        System.Runtime.InteropServices.Marshal.Copy(buf, 4 + j * 8, (IntPtr)sendobj.Data, 8);
                        //程序更改成循环发送,一直发送直到成功。
                        while (AdvCan.VCI_Transmit(m_devtype, m_devind, buf[3], ref sendobj, 1) == 0 && m_bOpen)
                        {
                            System.Threading.Thread.Sleep(10);
                        }
                        System.Threading.Thread.Sleep(5);
                    }
                }

                return(true);
            }
            catch (Exception ee)
            {
                Log.WriteFileLog("发送数据:" + ee.ToString());
                return(false);
            }
        }