/// <summary> /// 对外接口,通过CAN发送数据 /// </summary> /// <param name="str">发送数据的命令</param> /// <returns>发送状态</returns> public bool Write(string str) { List <SendCMD> sendCMDs = new List <SendCMD>(); CAN_DataFrame sendobj = new CAN_DataFrame(); sendobj.nDataLen = 8; //str = str.Substring(1); str = str.Replace('$', ' '); var cmds = str.Split(','); for (int i = 0; i < cmds.Length; i++) { if (cmds[i] == "" || cmds[i] == ",") { continue; } SendCMD a = new SendCMD(); a.Name = cmds[i].Substring(0, 6); var ttt = cmds[i].Substring(6); a.Value = Convert.ToInt32(cmds[i].Substring(6)); a.ID = CheckID(a.Name); sendobj.uID = a.ID; sendCMDs.Add(a); } sendobj.nSendType = 0; //Normal send sendobj.bRemoteFlag = 0; //不是远程帧 sendobj.bExternFlag = 1; //扩展帧 sendobj.nDataLen = 8; OganizeData(sendCMDs, ref sendobj); if (IsCANopen) { if (CanCmd.CAN_ChannelSend(CANDeviceHandle, canDeviceChannel, ref sendobj, 1) == 0) { Info?.Invoke("[E]发送失败"); } else { Info?.Invoke("[I]发送成功"); } } else { Info?.Invoke("[E]CAN未打开"); } return(true); }
/// <summary> /// 一对一发送命令/数据 /// </summary> /// <param name="nDestId"></param>命令/数据目的ID /// <param name="nCmd"></param>命令 /// <param name="rData"></param>数据 /// <returns></returns> public bool SyncRequest(int nDestId, int nCmd, byte[] Data) { bool boRC = false;//运行正常与否标志位 Socket socket; if (nCmd != (int)HC_FSM_COMMAND_TYPE.HC_CMD_DISPLAY_OFF && nCmd != (int)HC_FSM_COMMAND_TYPE.HC_CMD_DISPLAY_ON && !SubsysIsConnected(Commonfunction.GetSubsysIndex(nDestId))) { Trace.WriteLine(string.Format("当前子系统不可用,函数SyncRequest nDestId:{0},nCmd={1}", nDestId, nCmd)); #if REALEASE GlobalDataInterface.WriteErrorInfo(string.Format("当前子系统不可用,函数SyncRequest nDestId:{0},nCmd={1}", nDestId, nCmd)); #endif return(false); } //C++: AfxGetApp()->BeginWaitCursor(); string strIP = ""; int nSubsysId = Commonfunction.GetSubSysID(nDestId); int nPortNum = ConstPreDefine.FSM_PORT_NUM; if (nCmd >= 0x2000 && nCmd < 0x3000) //判断为HC->IPM的发送命令 { nPortNum = ConstPreDefine.IPM_PORT_NUM; nSubsysId = Commonfunction.GetIPMID(nDestId); } string strTemp = ConstPreDefine.LC_IP_ADDR_TEMPLATE; strIP = strTemp + nSubsysId; //得到发送的IP地址 //if (nCmd >= 0x7100 && nCmd <= 0x7101) //判断为HC->SIM的发送命令 if (nCmd >= 0x7000 && nCmd <= 0x7102) //判断为HC->SIM的发送命令 { nPortNum = ConstPreDefine.SIM_PORT_NUM; strIP = ConstPreDefine.SIM_IP_ADDR;//得到发送的IP地址 } try { Lock(1000);//资源加锁 socket = CreateSocket(); //创建socket socket.SendBufferSize = 0; //网络发送缓冲区为0 socket.SendTimeout = nTrySendTime; //设置发送超时时间 socket.NoDelay = false; //if (nCmd == (int)HC_FSM_COMMAND_TYPE.HC_CMD_DISPLAY_ON) // boRC = ConnectoServer(socket, strIP, nPortNum, true);//初始连接 //else //boRC = ConnectoServer(socket, strIP, nPortNum, false);//运行状态下连接 boRC = ConnectoServer(socket, strIP, nPortNum, true);//2015-5-14 运行过程中会存在网线断了的情况 if (!boRC) { Trace.WriteLine("网络连接失败!"); #if REALEASE GlobalDataInterface.WriteErrorInfo(string.Format("网络连接失败!")); #endif UnLock(); socket.Close(); socket = null; Trace.WriteLine("Socket关闭"); #if REALEASE GlobalDataInterface.WriteErrorInfo("Socket关闭"); #endif return(boRC); } //byte[] ABC = new byte[1]; //ABC[0] = 100; //if (nCmd == (int)HC_IPM_COMMAND_TYPE.HC_CMD_CONTINUOUS_SAMPLE_ON) //{ // QueryPerformanceFrequency(ref freq); // QueryPerformanceCounter(ref count); // Trace.WriteLine("发送连续采集前同步信息开始"); // boRC = Send(socket, ABC);//发送同步信息 // Trace.WriteLine("发送连续采集前同步信息结束"); //} SendCMD cmd = new SendCMD(); cmd.SYNC = 0x434e5953; cmd.nSrcId = ConstPreDefine.HC_ID; //发送源ID cmd.nDestId = nDestId; //发送目的ID cmd.nCmd = nCmd; int nStructLen = 4 * sizeof(int); byte[] bytes = new byte[nStructLen]; bytes = Commonfunction.StructToBytes(cmd);//将结构体转化为byte数组 //if (nCmd == (int)HC_IPM_COMMAND_TYPE.HC_CMD_CONTINUOUS_SAMPLE_ON) // Trace.WriteLine("发送连续采集命令头开始"); boRC = Send(socket, bytes);//发送命令头 //if (nCmd == (int)HC_IPM_COMMAND_TYPE.HC_CMD_CONTINUOUS_SAMPLE_ON) //{ // //socket.RE // Trace.WriteLine("发送连续采集命令头结束"); //} ////测试获取图像命令发送时间 //QueryPerformanceCounter(ref count1); //count = count1 - count; //result = (double)(count) / (double)freq; //Trace.WriteLine("发送连续采集同步信息+命令头时间:" + result); if (!boRC) { Trace.WriteLine("网络发送命令头错误!"); #if REALEASE GlobalDataInterface.WriteErrorInfo(string.Format("网络发送命令头错误!")); #endif goto leave; } int A = BitConverter.ToInt32(bytes, 12); if (Data != null) { boRC = Send(socket, Data);//发送数据 if (!boRC) { Trace.WriteLine("网络发送数据错误!"); #if REALEASE GlobalDataInterface.WriteErrorInfo(string.Format("网络发送数据错误!")); #endif goto leave; } } leave: DestroySocket(socket, boRC); UnLock(); //AfxGetApp()->EndWaitCursor(); if (boRC) { if (Data != null) { Trace.WriteLine(string.Format("成功:函数SyncRequest nDestId:{0},nCmd={1},数据长度={2}", nDestId, nCmd, Data.Length)); //#if REALEASE // GlobalDataInterface.WriteErrorInfo(string.Format("成功:函数SyncRequest nDestId:{0},nCmd={1},数据长度={2}", nDestId, nCmd, Data.Length)); //#endif } else { Trace.WriteLine(string.Format("成功:函数SyncRequest nDestId:{0},nCmd={1}", nDestId, nCmd)); //#if REALEASE // GlobalDataInterface.WriteErrorInfo(string.Format("成功:函数SyncRequest nDestId:{0},nCmd={1}", nDestId, nCmd)); //#endif //delete by xcw 20201207 } } else { if (nCmd == (int)HC_FSM_COMMAND_TYPE.HC_CMD_DISPLAY_ON) { m_IsConnected[Commonfunction.GetSubsysIndex(nDestId)] = false; } if (Data != null) { Trace.WriteLine(string.Format("失败:函数SyncRequest nDestId:{0},nCmd={1},数据长度={2},当前时间" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), nDestId, nCmd, Data.Length)); #if REALEASE GlobalDataInterface.WriteErrorInfo(string.Format("失败:函数SyncRequest nDestId:{0},nCmd={1},数据长度={2},当前时间" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), nDestId, nCmd, Data.Length)); #endif } else { Trace.WriteLine(string.Format("失败:函数SyncRequest nDestId:{0},nCmd={1},当前时间" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), nDestId, nCmd)); #if REALEASE GlobalDataInterface.WriteErrorInfo(string.Format("失败:函数SyncRequest nDestId:{0},nCmd={1},当前时间" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), nDestId, nCmd)); #endif //add by xcw 20201207 } } } catch (Exception e) { Trace.WriteLine("失败:函数SyncRequest" + e); #if REALEASE GlobalDataInterface.WriteErrorInfo("失败:函数SyncRequest" + e); #endif return(false); } return(boRC); }
/// <summary> /// 一对一发送命令/数据 /// </summary> /// <param name="nDestId"></param>命令/数据目的ID /// <param name="nCmd"></param>命令 /// <param name="rData"></param>数据 /// <returns></returns> public bool SyncRequest(int nDestId, int nCmd, byte[] Data) { bool boRC = false;//运行正常与否标志位 Socket socket; if (nCmd != (int)HC_FSM_COMMAND_TYPE.HC_CMD_DISPLAY_OFF && nCmd != (int)HC_FSM_COMMAND_TYPE.HC_CMD_DISPLAY_ON && !SubsysIsConnected(Commonfunction.GetSubsysIndex(nDestId))) { Trace.WriteLine(string.Format("当前子系统不可用,函数SyncRequest nDestId:{0},nCmd={1}", nDestId, nCmd)); #if REALEASE GlobalDataInterface.WriteErrorInfo(string.Format("当前子系统不可用,函数SyncRequest nDestId:{0},nCmd={1}", nDestId, nCmd)); #endif return(false); } //C++: AfxGetApp()->BeginWaitCursor(); string strIP = ""; int nSubsysId = Commonfunction.GetSubSysID(nDestId); int nPortNum = ConstPreDefine.FSM_PORT_NUM; if (nCmd >= 0x2000 && nCmd < 0x3000) //判断为HC->IPM的发送命令 { nPortNum = ConstPreDefine.IPM_PORT_NUM; nSubsysId = Commonfunction.GetIPMID(nDestId); } string strTemp = ConstPreDefine.LC_IP_ADDR_TEMPLATE; strIP = strTemp + nSubsysId;//得到发送的IP地址 try { Lock(1000); //资源加锁 socket = CreateSocket(); //创建socket socket.SendBufferSize = 0; //网络发送缓冲区为0 if (nCmd == (int)HC_FSM_COMMAND_TYPE.HC_CMD_DISPLAY_ON) { boRC = ConnectoServer(socket, strIP, nPortNum, true, true); //初始连接 } else if ((nCmd >= (int)HC_FSM_COMMAND_TYPE.HC_CMD_DISPLAY_OFF && nCmd <= (int)HC_FSM_COMMAND_TYPE.HC_CMD_CUPSTATERESET) || (nCmd > (int)HC_FSM_COMMAND_TYPE.HC_CMD_DISPLAY_ON && nCmd <= (int)HC_FSM_COMMAND_TYPE.HC_CMD_GRADE_INFO)) //所有子系统发送 { boRC = ConnectoServer(socket, strIP, nPortNum, false, true); //运行状态下连接 } else { boRC = ConnectoServer(socket, strIP, nPortNum, false, false);//运行状态下连接 } if (!boRC) { Trace.WriteLine("网络连接失败!"); #if REALEASE GlobalDataInterface.WriteErrorInfo(string.Format("网络连接失败!")); #endif UnLock(); socket.Close(); return(boRC); } SendCMD cmd = new SendCMD(); cmd.SYNC = 0x434e5953; cmd.nSrcId = ConstPreDefine.HC_ID; //发送源ID cmd.nDestId = nDestId; //发送目的ID cmd.nCmd = nCmd; int nStructLen = 4 * sizeof(int); byte[] bytes = new byte[nStructLen]; bytes = Commonfunction.StructToBytes(cmd); //将结构体转化为byte数组 boRC = Send(socket, bytes); //发送命令头 if (!boRC) { Trace.WriteLine("网络发送命令头错误!"); #if REALEASE GlobalDataInterface.WriteErrorInfo(string.Format("网络发送命令头错误!")); #endif goto leave; } int A = BitConverter.ToInt32(bytes, 12); if (Data != null) { boRC = Send(socket, Data);//发送数据 if (!boRC) { Trace.WriteLine("网络发送数据错误!"); #if REALEASE GlobalDataInterface.WriteErrorInfo(string.Format("网络发送数据错误!")); #endif goto leave; } } leave: DestroySocket(socket, boRC); UnLock(); //AfxGetApp()->EndWaitCursor(); if (boRC) { Trace.WriteLine(string.Format("成功:函数SyncRequest nDestId:{0},nCmd={1},数据长度={2}", nDestId, nCmd, Data.Length)); #if REALEASE GlobalDataInterface.WriteErrorInfo(string.Format("成功:函数SyncRequest nDestId:{0},nCmd={1},数据长度={2}", nDestId, nCmd, Data.Length)); #endif } else { if (nCmd == (int)HC_FSM_COMMAND_TYPE.HC_CMD_DISPLAY_ON) { m_IsConnected[Commonfunction.GetSubsysIndex(nDestId)] = false; } Trace.WriteLine(string.Format("失败:函数SyncRequest nDestId:{0},nCmd={1},数据长度={2}", nDestId, nCmd, Data.Length)); #if REALEASE GlobalDataInterface.WriteErrorInfo(string.Format("失败:函数SyncRequest nDestId:{0},nCmd={1},数据长度={2}", nDestId, nCmd, Data.Length)); #endif } } catch (Exception e) { Trace.WriteLine("失败:函数SyncRequest" + e); #if REALEASE GlobalDataInterface.WriteErrorInfo("失败:函数SyncRequest" + e); #endif return(false); } return(boRC); }