using CompressorXN_Common; using CompressorXN_Model.Enums; using MFSerial_Lib; using System; using System.Threading; using thinger.DataConvertLib; namespace CompressorXN_Communication.MoFan { public class MFCANHelper { private static MFSerial mfser = new MFSerial(); public static void OpenCanDevice(string portName) { if (!mfser.Can_Is_Opened) { mfser.Can_Open(portName, 115200); } else { mfser.CanClose(); } if (!mfser.Can_Is_Opened) { Console.WriteLine($"{DateTime.Now}>>>>打开CAN设备异常!"); } else { MFCan_DevInfo dev = mfser.MFCanGetInfo(); Console.WriteLine($"{DateTime.Now}>>>>Device Info:"); Console.WriteLine($"NAME: {dev.Name}"); Console.WriteLine("ProtocolVersion: " + dev.ProtocolVersion); Console.WriteLine("SN: " + dev.SN); } } /// /// 初始化CAN /// /// public static void InitCan(int bps) { bool ret; MFCan_CFG cfg = new MFCan_CFG(); //CAN总线波特率 cfg.NormalBps = bps; ret = mfser.CanSet(cfg); if (ret) { Console.WriteLine($"{DateTime.Now}>>>>Device Set Success"); } else { Console.WriteLine($"{DateTime.Now}>>>>Device Set Failed"); } } private static Thread CANSendMsgThread = null; private static Thread CANReadMsgThread = null; /// /// 启动线程 /// public static void CAN_StartTask() { CANSendMsgThread = new Thread(new ThreadStart(SendCanMsgThread)); CANReadMsgThread = new Thread(new ThreadStart(ReadCanMsgThread)); //启动接收数据线程 GlobalVar.CAN_ReadMsgFlag = true; CANReadMsgThread.Start(); //启动发送数据线程 GlobalVar.CAN_SendMsgFlag = true; CANSendMsgThread.Start(); } /// /// 停止线程 /// public static void CAN_StopTask() { GlobalVar.CAN_ReadMsgFlag = false; GlobalVar.CAN_SendMsgFlag = false; CANSendMsgThread.Join(); CANReadMsgThread.Join(); } /// /// 发送CAN报文 /// public static void SendCanMsgThread() { MFCan_MSG sendMsg = new MFCan_MSG(); while (mfser.Can_Is_Opened && GlobalVar.CAN_SendMsgFlag) { sendMsg.Ch = 0; sendMsg.Id = Convert.ToUInt32(GlobalVar.agreementMsgVM.SendId, 16); sendMsg.Dlc = ByteArrayLib.GetByteArrayFromInt(GlobalVar.agreementMsgVM.FrameLen)[0];//报文数据长度 sendMsg.Type = GlobalVar.agreementMsgVM.FrameType == "EXTEND" ? (byte)MFCan_MSG.CAN_MSG_TYPE_ED : (byte)MFCan_MSG.CAN_MSG_TYPE_SD;//息帧类型 0:标准数据帧 2:扩展数据帧 switch (GlobalVar.stepEnum) { case StepEnum.idling: string idlingHex = GlobalVar.agreementMsgVM.IdlingHex; if (!string.IsNullOrEmpty(idlingHex)) { sendMsg.Dat = ByteArrayLib.GetByteArrayFromHexString(idlingHex); } break; case StepEnum.speed1: string speed1Hex = GlobalVar.agreementMsgVM.Speed1Hex; if (!string.IsNullOrEmpty(speed1Hex)) { sendMsg.Dat = ByteArrayLib.GetByteArrayFromHexString(speed1Hex); } break; case StepEnum.speed2: string speed2Hex = GlobalVar.agreementMsgVM.Speed2Hex; if (!string.IsNullOrEmpty(speed2Hex)) { sendMsg.Dat = ByteArrayLib.GetByteArrayFromHexString(speed2Hex); } break; case StepEnum.speed3: string speed3Hex = GlobalVar.agreementMsgVM.Speed3Hex; if (!string.IsNullOrEmpty(speed3Hex)) { sendMsg.Dat = ByteArrayLib.GetByteArrayFromHexString(speed3Hex); } break; case StepEnum.endolead: string endoleadHex = GlobalVar.agreementMsgVM.EndoleadHex; if (string.IsNullOrEmpty(endoleadHex)) { sendMsg.Dat = ByteArrayLib.GetByteArrayFromHexString(endoleadHex); } break; case StepEnum.singleDriver: string singleDriverHex = GlobalVar.agreementMsgVM.SingleDriverHex; if (!string.IsNullOrEmpty(singleDriverHex)) { sendMsg.Dat = ByteArrayLib.GetByteArrayFromHexString(singleDriverHex); } break; } mfser.CanSendOne(sendMsg); //附加报文 if (!string.IsNullOrEmpty(GlobalVar.agreementMsgVM.SendAdditionalRules.AdditionalSendId)) { sendMsg.Ch = 0; sendMsg.Id = Convert.ToUInt32(GlobalVar.agreementMsgVM.SendAdditionalRules.AdditionalSendId, 16); sendMsg.Dlc = 8;//报文数据长度 sendMsg.Type = MFCan_MSG.CAN_MSG_TYPE_SD;//息帧类型 0:标准数据帧 2:扩展数据帧 sendMsg.Dat = ByteArrayLib.GetByteArrayFromHexString(GlobalVar.agreementMsgVM.SendAdditionalRules.AdditionalContent); mfser.CanSendOne(sendMsg); } Thread.Sleep(GlobalVar.agreementMsgVM.SendPeriod); } } /// /// 接收CAN报文 /// public static void ReadCanMsgThread() { MFCan_MSG[] r_msg = new MFCan_MSG[10000]; int num; while (mfser.Can_Is_Opened && GlobalVar.CAN_ReadMsgFlag) { num = mfser.MFCanGetMsg(r_msg, 10000); for (int i = 0; i < num; i++) { //判断获取的是不是目标报文 if (r_msg[i].Id == Convert.ToUInt32(GlobalVar.agreementMsgVM.ReciveId, 16) && r_msg[i].Dlc == 8) { GetCANReciveValHelper.GetReciveVal(r_msg[i].Dat);//从接收报文中解析实际值 } } } } } }