/// <summary> /// 关闭COM口 /// </summary> /// <returns></returns> public bool DisConnectToCOM() { if (isCOMRun) { bool isportname = true; string[] strr = System.IO.Ports.SerialPort.GetPortNames(); foreach (string strCom in strr) { if (strCom == mSerial.PortName) { if (mSerial.IsOpen) { mSerial.Close(); } isportname = false; return(!mSerial.IsOpen); } } if (isportname) { MESSIGEEventArgs eE = new MESSIGEEventArgs(); eE.MyMessage = "无" + mSerial.PortName + "端口!"; eE.MyType = MESSIGEEventArgs.MessageType.Error; OnTRIGGERMESSIGE(eE); } } return(!mSerial.IsOpen); }
/// <summary> /// 向COM口发送指令 /// </summary> /// <param name="cmd">需要发送的指令</param> public void WriteCOM(byte[] cmd) { MyOutDataTempList.Clear(); string[] strr = System.IO.Ports.SerialPort.GetPortNames(); foreach (string strCom in strr) { if (strCom == mSerial.PortName) { try { if (mSerial.IsOpen) { mSerial.DiscardOutBuffer(); //清除输出缓冲区 mSerial.DiscardInBuffer(); //丢弃来自串行驱动程序的接收缓冲区的数据 mSerial.Write(cmd, 0, cmd.Length); } } catch (Exception eee) { MESSIGEEventArgs eE = new MESSIGEEventArgs(); eE.MyMessage = eee.ToString(); eE.MyType = MESSIGEEventArgs.MessageType.Error; OnTRIGGERMESSIGE(eE); } } } }
void ConnnectToCOM(SerialPort sp) { if (isCOMRun) { mSerial = new SerialPort(); mSerial = sp; bool isportname = true; string[] strr = System.IO.Ports.SerialPort.GetPortNames(); foreach (string strCom in strr) { if (strCom == mSerial.PortName) { if (!mSerial.IsOpen) { mSerial.Open(); } iStopContTemp = 0; isportname = false; mSerial.DataReceived += new SerialDataReceivedEventHandler(m_Serial_DataReceived); } } if (isportname) { MESSIGEEventArgs eE = new MESSIGEEventArgs(); eE.MyMessage = "无" + mSerial.PortName + "端口!"; eE.MyType = MESSIGEEventArgs.MessageType.Error; OnTRIGGERMESSIGE(eE); } } }
public void Tick() { if (isCOMRun) { if (SendBytes == null && list_bytes.Count == 0 && list_bytes_First.Count == 0 && list_bytes_Sixed.Count == 0) { return; } if (iStopContTemp > Off_line_Number) { if (isResetTemp) { iCount = 0; DisConnectToCOM(); ConnnectToCOM(); if (iStopContTemp > Off_line_Number - 2) { iStopContTemp = Off_line_Number - 5; } isRUNing = false;//PLC掉线 isResetTemp = false; } else { if (iStopContTemp == Off_line_Number + 1) { iStopContTemp++; MESSIGEEventArgs eE = new MESSIGEEventArgs(); eE.MyData = SendBytes; eE.MyMessage = mSerial.PortName + " 站号:" + SendBytes[0] + "离线!"; eE.MyType = MESSIGEEventArgs.MessageType.Warning; OnTRIGGERMESSIGE(eE); } } } else if (iStopContTemp > 0 && iStopContTemp % 10 == 0) { if (SendBytes != null) { WriteCOM(SendBytes); iCount = 1; } else { SendData(); } } iStopContTemp++; } }
void m_Serial_DataReceived(object sender, SerialDataReceivedEventArgs e) { int n = mSerial.BytesToRead; //先记录下来,避免某种原因,人为的原因,操作几次之间时间长,缓存不一致 byte[] buf = new byte[n]; // mSerial.Read(buf, 0, n); //读取缓冲数据 mSerial.DiscardInBuffer(); //清除输入缓冲区 foreach (byte b in buf) { MyOutDataTempList.Add(b); } if (MyOutDataTempList.Count > 2) { if (CRC16_CHECK(MyOutDataTempList))//CRC校验比对是否成功 { byte[] byteArray = new byte[MyOutDataTempList.Count]; for (int i = 0; i < MyOutDataTempList.Count; i++) { byteArray[i] = MyOutDataTempList[i]; } MyOutDataTempList.Clear(); String str = BitConverter.ToString(byteArray, 0).ToUpper(); MESSIGEEventArgs eE = new MESSIGEEventArgs(); eE.MyMessage = str; eE.SendData = SendBytes.Clone() as byte[]; eE.MyData = byteArray; eE.MyType = MESSIGEEventArgs.MessageType.Data; OnTRIGGERMESSIGE(eE); iCountTemp++; if (!watch.IsRunning) { watch.Start(); } if (watch.ElapsedMilliseconds > 1000) { watch.Stop(); watch.Reset(); watch.Start(); iCount = iCountTemp; iCountTemp = 0; } isRUNing = true; iStopContTemp = 0; SendBytes = null; SendData(); } } }
/// <summary> /// 连接COM口设备 /// </summary> /// <returns></returns> public bool ConnnectToCOM() { if (isCOMRun) { bool isportname = true; string[] strr = System.IO.Ports.SerialPort.GetPortNames(); foreach (string strCom in strr) { if (strCom == mSerial.PortName) { if (!mSerial.IsOpen) { try { mSerial.Open(); mSerial.DiscardInBuffer(); //清除输入缓冲区 mSerial.DiscardOutBuffer(); //清除输出缓冲区 mSerial.DataReceived += new SerialDataReceivedEventHandler(m_Serial_DataReceived); isportname = false; } catch { MESSIGEEventArgs eE = new MESSIGEEventArgs(); eE.MyMessage = mSerial.PortName + "被占用!"; eE.MyType = MESSIGEEventArgs.MessageType.Error; OnTRIGGERMESSIGE(eE); } } return(mSerial.IsOpen); } if (isportname) { MESSIGEEventArgs eEE = new MESSIGEEventArgs(); eEE.MyMessage = "无" + mSerial.PortName + "端口!"; eEE.MyType = MESSIGEEventArgs.MessageType.Error; OnTRIGGERMESSIGE(eEE); } } } return(mSerial.IsOpen); }
/// <summary> /// 初始化COM口 /// </summary> /// <param name="isDebug">COM是否跑线</param> /// <param name="PLCiniAddress">COM口的INI地址</param> public void Initial(string INIAddress, bool isDebug) { isCOMRun = !isDebug; isRUNing = isDebug; try { if (isCOMRun) { SERIALPOETINI mINI = new SERIALPOETINI(INIAddress); if (!mSerial.IsOpen) { mSerial.PortName = mINI.stPort; mSerial.BaudRate = mINI.iRates; mSerial.DataBits = mINI.iDataBits; //奇偶校验位 if (mINI.Parity == "Even") { mSerial.Parity = Parity.Even; } if (mINI.Parity == "Mark") { mSerial.Parity = Parity.Mark; } if (mINI.Parity == "None") { mSerial.Parity = Parity.None; } if (mINI.Parity == "Odd") { mSerial.Parity = Parity.Odd; } if (mINI.Parity == "Space") { mSerial.Parity = Parity.Space; } //停止位 if (mINI.StopBits == 1) { mSerial.StopBits = StopBits.One; } if (mINI.StopBits == 0) { mSerial.StopBits = StopBits.None; } if (mINI.StopBits == 1.5) { mSerial.StopBits = StopBits.OnePointFive; } if (mINI.StopBits == 2) { mSerial.StopBits = StopBits.Two; } mSerial.ReadTimeout = 60 * 60 * 1000; //读超时 mSerial.WriteTimeout = 60 * 1000; //写超时 mSerial.ReadBufferSize = 1024; //设定读出的缓存区大小 mSerial.WriteBufferSize = 512; //设定写入的缓存区大小 //bAddress = (byte)mINI.iPRO; } ConnnectToCOM(); } } catch (Exception eee) { MESSIGEEventArgs eE = new MESSIGEEventArgs(); eE.MyType = MESSIGEEventArgs.MessageType.Error; eE.MyMessage = eee.ToString(); OnTRIGGERMESSIGE(eE); } }
// 触发事件的方法 protected virtual void OnTRIGGERMESSIGE(MESSIGEEventArgs e) { TRIGGERMESSIGE?.Invoke(this, e); }
private void MSERIALPORT_TRIGGERMESSIGE(object sender, SERIALPORT.MESSIGEEventArgs e) { switch (e.MyType) { case SERIALPORT.MESSIGEEventArgs.MessageType.Warning: break; case SERIALPORT.MESSIGEEventArgs.MessageType.Error: break; case SERIALPORT.MESSIGEEventArgs.MessageType.Message: break; case SERIALPORT.MESSIGEEventArgs.MessageType.Data: if (e.MyData[0] == PRO) { //发出去的寄存器地址 string strTemp = ""; strTemp = e.SendData[2].ToString("X2") + e.SendData[3].ToString("X2"); int iRegister = Convert.ToInt32(strTemp, 16); RegisterEnum temp = (RegisterEnum)iRegister; //发出去的功能码 string strFunction = e.SendData[1].ToString("X2"); FunctionCodeEnum Function = (FunctionCodeEnum)Convert.ToInt32(strFunction); int inumber = 0; byte[] byteArray = null; if (Function == FunctionCodeEnum.MultipleReads) { try { //抓取数据回来 inumber = e.MyData[2]; byteArray = new byte[inumber]; for (int i = 0; i < inumber; i++) { byteArray[i] = e.MyData[i + 3]; } } catch (Exception ex) { MESSIGEEventArgs ee = new MESSIGEEventArgs(); ee.MyType = MESSIGEEventArgs.MessageType.Error; ee.MyMessage = ex.Message; OnTRIGGERMESSIGE(ee); } } else { return; } switch (temp) { case RegisterEnum.MotorMode: MotorModel = System.Text.Encoding.Default.GetString(byteArray).Replace("\0", ""); break; case RegisterEnum.MotorVersionHardware: MotorVersionHardware = System.Text.Encoding.Default.GetString(byteArray).Replace("\0", ""); break; case RegisterEnum.MotorVersionSoftware: MotorVersionSoftware = System.Text.Encoding.Default.GetString(byteArray).Replace("\0", ""); break; case RegisterEnum.MotorErrorCode: string error = ""; foreach (byte by in byteArray) { error += Convert.ToString(by, 2).PadLeft(8, '0'); } error = ToMotorError(error); if (error != "") { MESSIGEEventArgs ee = new MESSIGEEventArgs(); ee.MyType = MESSIGEEventArgs.MessageType.Error; ee.MyMessage = error; OnTRIGGERMESSIGE(ee); } break; case RegisterEnum.MotorPositionNow: strTemp = ""; if (byteArray.Length == 4) { for (int i = 0; i < byteArray.Length; i++) { strTemp += byteArray[i].ToString("X2"); } } MotorPositionNow = Convert.ToInt32(strTemp, 16); break; case RegisterEnum.MotorSpeedNow: strTemp = ""; for (int i = 0; i < byteArray.Length; i++) { strTemp += byteArray[i].ToString("X2"); } MotorSpeedNow = Convert.ToInt32(strTemp, 16); break; case RegisterEnum.MotorObjectPosition: strTemp = ""; for (int i = 0; i < byteArray.Length; i++) { strTemp += byteArray[i].ToString("X2"); } iObjectrPosition = Convert.ToInt32(strTemp, 16); break; case RegisterEnum.MotorObjectSpeed: strTemp = ""; for (int i = 0; i < byteArray.Length; i++) { strTemp += byteArray[i].ToString("X2"); } iObjectSpeed = Convert.ToInt32(strTemp, 16); break; case RegisterEnum.MotorAcceleration: strTemp = ""; for (int i = 0; i < byteArray.Length; i++) { strTemp += byteArray[i].ToString("X2"); } iAcceleration = Convert.ToInt32(strTemp, 16); break; case RegisterEnum.MotorDeceleration: strTemp = ""; for (int i = 0; i < byteArray.Length; i++) { strTemp += byteArray[i].ToString("X2"); } iDeceleration = Convert.ToInt32(strTemp, 16); break; case RegisterEnum.MotorQuickStopDeceleration: strTemp = ""; for (int i = 0; i < byteArray.Length; i++) { strTemp += byteArray[i].ToString("X2"); } iQuickStopDeceleration = Convert.ToInt32(strTemp, 16); break; case RegisterEnum.MotorHomeAddSubtract: strTemp = ""; for (int i = 0; i < byteArray.Length; i++) { strTemp += byteArray[i].ToString("X2"); } iHomeAddSubtract = Convert.ToInt32(strTemp, 16); break; case RegisterEnum.MotorHomeMechanicsSpeed: strTemp = ""; for (int i = 0; i < byteArray.Length; i++) { strTemp += byteArray[i].ToString("X2"); } iHomeMechanicsSpeed = Convert.ToInt32(strTemp, 16); break; case RegisterEnum.MotorHomeSpeed: strTemp = ""; for (int i = 0; i < byteArray.Length; i++) { strTemp += byteArray[i].ToString("X2"); } iHomeSpeed = Convert.ToInt32(strTemp, 16); break; case RegisterEnum.MotorZeroOffset: strTemp = ""; for (int i = 0; i < byteArray.Length; i++) { strTemp += byteArray[i].ToString("X2"); } iZeroOffset = Convert.ToInt32(strTemp, 16); break; case RegisterEnum.MotorState: strTemp = ""; for (int i = 0; i < byteArray.Length; i++) { strTemp += byteArray[i].ToString("X2"); } strTemp = Convert.ToString(Convert.ToInt32(strTemp, 16), 2).PadLeft(16, '0'); ToMotorState(strTemp); break; } } break; } }