/// <summary> /// 连接参数初始化 /// </summary> public void Init() { if (!serialPort.IsOpen) { try { serialPort.PortName = _sys_serial.PortName; serialPort.BaudRate = _sys_serial.BaudRate; serialPort.DataBits = _sys_serial.DataBits; serialPort.StopBits = _sys_serial.StopBits; serialPort.Parity = _sys_serial.Parity; serialPort.Encoding = Encoding.UTF8; //serialPort.DataReceived += SerialPort_DataReceived; serialPort.Open(); //开启线程读取串口数据 Thread trdRead = new Thread(SerialPortRead); trdRead.IsBackground = true; trdRead.Start(); //另开线程分析读取到的数据 Thread trdDataAnalysis = new Thread(DataAnalysis); trdDataAnalysis.IsBackground = true; trdDataAnalysis.Start(); } catch (Exception ex) { msg.msgtype = Common.Common.MessageType.Error; msg.messageinfo = ex.Message; msg.is_success = false; Event_Msg?.Invoke(msg); } } }
/// <summary> /// 串口读取方法 /// </summary> void SerialPortRead() { while (_keepReading) { if (serialPort == null) { msg.msgtype = Common.Common.MessageType.Error; msg.messageinfo = "串口对象未实例化"; msg.is_success = false; Event_Msg?.Invoke(msg); Thread.Sleep(3000); //3秒后重新检测 continue; } if (!serialPort.IsOpen) { msg.msgtype = Common.Common.MessageType.Error; msg.messageinfo = "串口未打开"; msg.is_success = false; Event_Msg?.Invoke(msg); Thread.Sleep(3000); continue; } try { #region 行读取 string buffer = serialPort.ReadLine(); if (!string.IsNullOrEmpty(buffer)) //可以不加判断,允许添加null值,数据解析时,再做判断。 { _cq.Enqueue(buffer); } #endregion } catch (TimeoutException) //注意超时时间的定义 { msg.msgtype = Common.Common.MessageType.Error; msg.messageinfo = "串口读取超时"; msg.is_success = false; Event_Msg?.Invoke(msg); } catch (Exception ex) //排除隐患后可以去掉。 { msg.msgtype = Common.Common.MessageType.Error; msg.messageinfo = $"串口读取异常:{ex.Message}"; msg.is_success = false; Event_Msg?.Invoke(msg); } } }
/// <summary> /// 事件触发 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) { try { byte[] m_recvBytes = new byte[serialPort.BytesToRead]; //定义缓冲区大小 int result = serialPort.Read(m_recvBytes, 0, m_recvBytes.Length); //从串口读取数据 if (result <= 0) { return; } string strResult = Encoding.UTF8.GetString(m_recvBytes, 0, m_recvBytes.Length); //对数据进行转换 Console.WriteLine(strResult); Tool.Write_File(strResult); serialPort.DiscardInBuffer(); } catch (Exception ex) { msg.msgtype = Common.Common.MessageType.Error; msg.messageinfo = ex.Message; msg.is_success = false; Event_Msg?.Invoke(msg); } }
/// <summary> /// 数据解析逻辑 /// </summary> /// <param name="strResult"></param> private void ReceiveData_Logic(string strResult) { sys_receive_data return_data = new sys_receive_data(); bool ok = strResult.IndexOf("RE003,OK") >= 0 ? true : false; bool error = strResult.IndexOf("RE004,ERROR") >= 0 ? true : false; bool e10 = strResult.IndexOf("E10") >= 0 ? true : false; bool re = strResult.IndexOf("RE,") >= 0 ? true : false; //接收发送指令后的返回值 if (ok || error || e10) { sys_send_result ret = new sys_send_result(); string[] r = strResult.Replace("\r\n", "").Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries); if (r.Length == 2) { ret.code = r[0]; ret.msg = r[1]; } switch (r[0]) { case "RE003": ret.txt = "设置成功"; msg.msgtype = Common.Common.MessageType.Info; msg.messageinfo = ret.txt; msg.is_success = true; Event_Msg?.Invoke(msg); break; case "RE004": ret.txt = "设定值错误"; msg.msgtype = Common.Common.MessageType.Error; msg.messageinfo = ret.txt; msg.is_success = false; Event_Msg?.Invoke(msg); break; case "E10": ret.txt = "设定值错误,送信指令的前端没有附加AT指令"; msg.msgtype = Common.Common.MessageType.Error; msg.messageinfo = ret.txt; msg.is_success = false; Event_Msg?.Invoke(msg); break; default: ret.txt = strResult; msg.msgtype = Common.Common.MessageType.Info; msg.messageinfo = ret.txt; msg.is_success = false; Event_Msg?.Invoke(msg); break; } return_data.ReturnType = Common.Common.ReturnDataType.SettingRet; return_data.Send_Result = ret; } //接收仪器主动发送的值 else if (re) { List <string> data = strResult.Replace("\r\n", "").Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries).ToList(); switch (_Singleton._sys_serial.CommuitType) { case Common.Common.ComType.M3ID: return_data.Head = data[0]; return_data.SeqNo = data[1]; return_data.Torque_data = data[2]; return_data.Torque_unit = data[3]; return_data.Angle_data = data[4]; return_data.Ang_unit = data[5]; return_data.Result = data[6]; return_data.Sn = data[7]; switch (_Singleton._sys_serial.WorkType) { case Common.Common.WorkMode.Torque: return_data.IsOk = data[6].Substring(0, 1) == "O"; break; case Common.Common.WorkMode.Ang: return_data.IsOk = data[6].Substring(1, 1) == "O"; break; case Common.Common.WorkMode.Both: return_data.IsOk = data[6] == "OO"; break; default: break; } break; case Common.Common.ComType.M3: return_data.Head = data[0]; return_data.SeqNo = data[1]; return_data.Torque_data = data[2]; break; default: break; } return_data.ReturnType = Common.Common.ReturnDataType.ProduceRet; } else { } Receive_Result?.Invoke(return_data); }