using System; using System.Collections.Generic; using System.IO.Ports; using System.Linq; using System.Threading; using System.Timers; using System.Windows.Forms; using Gs.DevApp.Entity; using Gs.DevApp.ToolBox; using Newtonsoft.Json; namespace Gs.DevApp.DevFrm.Work { public partial class Frm_Work09 : DevExpress.XtraEditors.XtraForm { string _webServiceName = "WorkWeight/"; string value = string.Empty; /// /// 串口类 /// private SerialPort Sp = new SerialPort(); System.Timers.Timer timer = new System.Timers.Timer(10000); public Frm_Work09() { InitializeComponent(); this.FormClosing += (s, e) => { if (Sp.IsOpen) Sp.Close(); if (timer != null) { timer.Stop(); timer.Dispose(); } }; GetComList(); this.comLine.getSuppler(""); Gs.DevApp.ToolBox.UtilityHelper.SetGridViewParameterMx(gvMx1); } /// /// 从注册表获取系统串口列表 /// private void GetComList() { this.cmbSerialPortNum.Clear(); string[] ports = SerialPort.GetPortNames(); foreach (string port in ports) { cmbSerialPortNum.Properties.Items.Add(port); } } /// /// 启动事件 /// /// /// private void btnStart_Click(object sender, EventArgs e) { Sp.DataReceived -= new SerialDataReceivedEventHandler(Sp_DataReceived); string _comLine = comLine.GetId(); string _cmbSerialPortNum = cmbSerialPortNum.Text.Trim(); string _cmbBaudRate = cmbBaudRate.Text.Trim(); string _comSjw = comSjw.Text.Trim(); string _comStopBits = comStopBits.Text.Trim(); string _comParity = comParity.Text.Trim(); if (string.IsNullOrEmpty(_comLine)) { Gs.DevApp.ToolBox.MsgHelper.ShowError("请选择线体"); this.comLine.Focus(); return; } if (cmbSerialPortNum.SelectedIndex < 0) { Gs.DevApp.ToolBox.MsgHelper.ShowError("请选择串口号"); this.cmbSerialPortNum.Focus(); return; } if (cmbBaudRate.SelectedIndex < 0) { Gs.DevApp.ToolBox.MsgHelper.ShowError("请选择波特率"); this.cmbBaudRate.Focus(); return; } if (comSjw.SelectedIndex < 0) { Gs.DevApp.ToolBox.MsgHelper.ShowError("请选择数据位"); this.comSjw.Focus(); return; } if (comStopBits.SelectedIndex < 0) { Gs.DevApp.ToolBox.MsgHelper.ShowError("请选择停止位"); this.comStopBits.Focus(); return; } if (comParity.SelectedIndex < 0) { Gs.DevApp.ToolBox.MsgHelper.ShowError("请选择校验"); this.comParity.Focus(); return; } try { Sp.ReceivedBytesThreshold = 1; Sp.PortName = _cmbSerialPortNum; Sp.BaudRate = Convert.ToInt32(_cmbBaudRate);//设置波特率 if (Enum.TryParse(_comParity, out Parity pt1)) { Sp.Parity = pt1;// 设置校验位 } else { Gs.DevApp.ToolBox.MsgHelper.ShowError("无法识别的校验"); } if (Enum.TryParse(_comStopBits, out StopBits pt2)) { Sp.StopBits = pt2;//设置停止位 } else { Gs.DevApp.ToolBox.MsgHelper.ShowError("无法识别的停止位"); } Sp.DataBits = int.Parse(_comSjw); // 设置数据位 //Sp.ReadTimeout = 500; // 设置超时时间,例如500毫秒 //Sp.ReadBufferSize = 4096; // 设置缓冲区大小 Sp.DataReceived += new SerialDataReceivedEventHandler(Sp_DataReceived); Sp.ReceivedBytesThreshold = 1; LogHelper.Debug(this.ToString(), "打开串口通信PortName-" + Sp.PortName.ToString() + ",BaudRate-" + Sp.BaudRate.ToString() + ",StopBits-" + Sp.StopBits.ToString() + ",Parity-" + Sp.Parity.ToString()); if (!Sp.IsOpen) Sp.Open(); setEnable(false); timer.Elapsed += OnTimedEvent; timer.AutoReset = true; // 设置为true表示重复执行,false表示执行一次后停止 timer.Enabled = true; // 开始计时 Gs.DevApp.ToolBox.MsgHelper.ShowInformation("打开成功!"); } catch (Exception exe) { LogHelper.Debug(this.ToString(), "打开失败:" + exe.Message); Gs.DevApp.ToolBox.MsgHelper.ShowError("打开失败" + exe.Message); } } /// /// 串口收到数据 /// /// /// public void Sp_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { string _tmpStr = string.Empty; try { int i = Sp.BytesToRead; if (i > 0) { _tmpStr = Sp.ReadExisting(); // Thread.Sleep(1000); LogHelper.Debug(this.ToString(), $"监听到数据,字节长度:{i.ToString()},{_tmpStr}"); this.BeginInvoke(new Action(() => { txtMsg.AppendLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff->字节数字" + i.ToString() + "->") + _tmpStr); //ST,GS,+ 250.2kg if (_tmpStr.Length <= 0) { LogHelper.Debug(this.ToString(), "_tmpStr长度<=0,退出上报"); return; } if (!_tmpStr.Contains("ST")) { LogHelper.Debug(this.ToString(), "_tmpStr重量状态不为ST,退出上报"); return; } if (!_tmpStr.Contains("+")) { LogHelper.Debug(this.ToString(), "_tmpStr不包含重量+,退出上报"); return; } string[] _ary=_tmpStr.Split('+'); string abc = _ary.Last();//ST,GS, txtNum.Text = (abc.Trim().Replace("k", "").Replace("g", "").Replace("S","").Replace("T","").Replace("G","").Replace(",","")); addModel(txtNum.Text, _tmpStr); })); } } catch (Exception ex) { LogHelper.Debug(this.ToString(), $"监听到数据error:{ex.Message}"); return; } } /// /// 启用或禁用 /// /// private void setEnable(bool bl) { comLine.Enabled = bl; cmbSerialPortNum.Enabled = bl; cmbBaudRate.Enabled = bl; comSjw.Enabled = bl; comStopBits.Enabled = bl; comParity.Enabled = bl; btnStart.Enabled = false; } /// /// 上传称重数据 /// /// 截取后的数量 /// 原子串 private void addModel(string _realWeight, string _realWeightTxt) { string _lineId = comLine.GetId(); var _obj = new { lineId = _lineId, realWeight = _realWeight.Trim(), realWeightTxt = _realWeightTxt.Trim(), }; try { string strJson = UtilityHelper.HttpPost("", _webServiceName + "EditModel", JsonConvert.SerializeObject(_obj)); ReturnModel _rtn = ToolBox.UtilityHelper.ReturnToDynamic(strJson); if (_rtn.rtnCode <= 0) { Toast vm = new Toast(-1, _rtn.rtnMsg); vm.Show(); } } catch (Exception ex) { ToolBox.MsgHelper.Warning("提示:" + ex.Message); } } /// /// 定时读取列表 /// /// /// private void OnTimedEvent(Object source, ElapsedEventArgs e) { var _obj = new { lineId = comLine.GetId(), }; try { var lst = new List(); var strReturn = UtilityHelper.HttpPost("", _webServiceName + "GetModelList", JsonConvert.SerializeObject(_obj), false); var dd = UtilityHelper.ReturnToList(strReturn); var dt = dd.rtnData; BeginInvoke(new Action(() => { gcMx1.BindingContext = new BindingContext(); gcMx1.DataSource = dt; gcMx1.ForceInitialize(); gvMx1.BestFitColumns(); })); } catch (Exception ex) { Toast vm = new Toast(-1, "gvMx1:" + ex.Message); vm.Show(); } } } }