using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.IO.Ports; using System.Windows.Forms; namespace WCS { /// /// 磅秤串口通讯线程 /// class ScaleComThread { SerialPort sp; #region 画面上同步显示控件 public ListBox scaledisplay; #endregion Thread trd = null; delegate void displayresponse(string text); int i = 1; int scaleno = 0, portno = 0; //int sum = 0; main form1; bool threadFlag = true, spFlag = true; public ScaleComThread(int scale, int port_no, main m) { scaleno = scale; portno = port_no; sp = new SerialPort(); sp.PortName = "COM" + port_no.ToString(); sp.BaudRate = 9600; sp.DataBits = 8; sp.Parity = Parity.None; sp.StopBits = StopBits.One; form1 = m; if (sp.IsOpen) return; try { sp.Open(); } catch (Exception r) { spFlag = false; //DisplayInfo("【" + DateTime.Now.ToString() + "】打开串口" + portno + "失败,请检查"); //return; } trd = new Thread(new ThreadStart(this.ThreadTask)); trd.IsBackground = true; trd.Start(); } /// /// 获取磅秤称重重量并解析 /// private void GetScaleData() { string s_SendString = "", s_RecStr = "", s_wt = "", s_part1 = "", s_part2 = "", s_part3 = "", s_part4 = "", s_part5 = "", s_part6 = "", s_part7 = "", s_imp = ""; int pos = 0, pos1 = 0, pos2 = 0; try { //s_SendString = "P"; //sp.DiscardInBuffer(); //sp.DiscardOutBuffer(); //sp.WriteLine(s_SendString); //Thread.Sleep(400); s_RecStr = ""; Common.gd_gross_wt[scaleno - 1] = 0; s_RecStr = sp.ReadExisting(); // DisplayInfo(s_RecStr); if (s_RecStr.Length <= 0) { DisplayInfo("【" + DateTime.Now.ToString() + "】未能得到磅称重量,请检查"); return; } if (scaleno == 1) { pos = s_RecStr.IndexOf("NT,"); if (pos > 0) { s_RecStr = s_RecStr.Substring(pos + 3, s_RecStr.Length - pos - 3); pos1 = s_RecStr.IndexOf("kg"); if (pos1 > 0) { s_RecStr = s_RecStr.Substring(0, pos1).Trim().Replace(" ", ""); try { Common.gd_gross_wt[scaleno - 1] = double.Parse(s_RecStr); } catch (Exception r) { Common.gd_gross_wt[scaleno - 1] = 0; } DisplayInfo("【" + DateTime.Now.ToString() + "】称重:" + s_RecStr + "KG"); sp.DiscardInBuffer(); sp.DiscardOutBuffer(); } else { Common.gd_gross_wt[scaleno - 1] = 0; //DisplayInfo("Read Data Error!------Date:" + System.DateTime.Now.ToString()); sp.DiscardInBuffer(); sp.DiscardOutBuffer(); } } } else if (scaleno == 2) { pos = s_RecStr.IndexOf("NT,"); if (pos > 0) { s_RecStr = s_RecStr.Substring(pos + 3, s_RecStr.Length - pos - 3); pos1 = s_RecStr.IndexOf("kg"); if (pos1 > 0) { s_RecStr = s_RecStr.Substring(0, pos1).Trim().Replace(" ", ""); try { Common.gd_gross_wt[scaleno - 1] = double.Parse(s_RecStr); } catch (Exception r) { Common.gd_gross_wt[scaleno - 1] = 0; } DisplayInfo("【" + DateTime.Now.ToString() + "】称重:" + s_RecStr + "KG"); sp.DiscardInBuffer(); sp.DiscardOutBuffer(); } else { Common.gd_gross_wt[scaleno - 1] = 0; //DisplayInfo("Read Data Error!------Date:" + System.DateTime.Now.ToString()); sp.DiscardInBuffer(); sp.DiscardOutBuffer(); } } } else if (scaleno == 3) { pos = s_RecStr.IndexOf("NT,"); if (pos > 0) { s_RecStr = s_RecStr.Substring(pos + 3, s_RecStr.Length - pos - 3); pos1 = s_RecStr.IndexOf("kg"); if (pos1 > 0) { s_RecStr = s_RecStr.Substring(0, pos1).Trim().Replace(" ", ""); try { Common.gd_gross_wt[scaleno - 1] = double.Parse(s_RecStr); } catch (Exception r) { Common.gd_gross_wt[scaleno - 1] = 0; } DisplayInfo("【" + DateTime.Now.ToString() + "】称重:" + s_RecStr + "KG"); sp.DiscardInBuffer(); sp.DiscardOutBuffer(); } else { Common.gd_gross_wt[scaleno - 1] = 0; //DisplayInfo("Read Data Error!------Date:" + System.DateTime.Now.ToString()); sp.DiscardInBuffer(); sp.DiscardOutBuffer(); } } } else if (scaleno == 4) { pos = s_RecStr.IndexOf("NT,"); if (pos > 0) { s_RecStr = s_RecStr.Substring(pos + 3, s_RecStr.Length - pos - 3); pos1 = s_RecStr.IndexOf("kg"); if (pos1 > 0) { s_RecStr = s_RecStr.Substring(0, pos1).Trim().Replace(" ", ""); try { Common.gd_gross_wt[scaleno - 1] = double.Parse(s_RecStr); } catch (Exception r) { Common.gd_gross_wt[scaleno - 1] = 0; } DisplayInfo("【" + DateTime.Now.ToString() + "】称重:" + s_RecStr + "KG"); sp.DiscardInBuffer(); sp.DiscardOutBuffer(); } else { Common.gd_gross_wt[scaleno - 1] = 0; //DisplayInfo("Read Data Error!------Date:" + System.DateTime.Now.ToString()); sp.DiscardInBuffer(); sp.DiscardOutBuffer(); } } } } catch (Exception t) { Common.gd_gross_wt[scaleno - 1] = 0; DisplayInfo("【" + DateTime.Now.ToString() + "】得到磅秤重量失败:" + t.Message); //DisplayInfo("未能得到磅称重量,请检查!---时间:" + System.DateTime.Now.ToString()); //Thread.Sleep(400); return; } } #region 通讯反馈同步显示 private void DisplayInfo(string text) { if (scaledisplay.InvokeRequired) { try { displayresponse d = new displayresponse(DisplayInfo); scaledisplay.Invoke(d, new object[] { text }); } catch (Exception r) { } } else { if (scaledisplay.Items.Count > 12) { scaledisplay.Items.Clear(); } scaledisplay.Items.Add(text); } } #endregion private void ThreadTask() { while (threadFlag) { if (spFlag) { GetScaleData(); } else { DisplayInfo("【" + DateTime.Now.ToString() + "】打开串口" + portno + "失败,请检查"); threadFlag = false; } Thread.Sleep(400); } } } }