using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.IO.Ports; using System.Windows.Forms; using System.Net; using System.Net.Sockets; namespace WCS { /// /// 磅秤TCP通讯线程 /// class ScaleTcpThread { SerialPort sp; #region 画面上同步显示控件 public ListBox scaledisplay; #endregion Thread trd = null; delegate void displayresponse(string text); int scaleno = 0, portno = 0; private string scaleIp; //int sum = 0; private IPEndPoint ServerInfo; private Socket socket; private Byte[] MsgBuffer; private Byte[] MsgSend; main form1; bool threadFlag = true, spFlag = true; public ScaleTcpThread(int scale_no, string scale_ip, int port, main m) { this.scaleno = scale_no; this.scaleIp = scale_ip; this.portno = port; this.form1 = m; MsgBuffer = new Byte[65535]; MsgSend = new Byte[65535]; //sp = new SerialPort(); //sp.PortName = "COM" + port.ToString(); //sp.BaudRate = 9600; //sp.DataBits = 8; //sp.Parity = Parity.None; //sp.StopBits = StopBits.One; //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(); } #region socket连接 /// /// socket连接WMS服务器 /// private void SocketConnect() { ServerInfo = new IPEndPoint(IPAddress.Parse(scaleIp), portno); try { socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socket.Connect(ServerInfo); //Int32 bytes = socket.Receive(MsgBuffer, MsgBuffer.Length, SocketFlags.None); //StringBuilder buff = new StringBuilder(); //String receiveData = Encoding.UTF8.GetString(MsgBuffer, 0, bytes); //socket.Send(Encoding.Unicode.GetBytes("socket connect!")); //RecevieData = "s"; //socket.BeginReceive(MsgBuffer, 0, MsgBuffer.Length, 0, new AsyncCallback(ReceiveCallBack), null); DisplayInfo("【" + DateTime.Now.ToString() + "】磅秤连接成功"); } catch (Exception em) { DisplayInfo("【" + DateTime.Now.ToString() + "】磅秤连接失败!" + em.Message); } } /// /// socket重新连接WMS服务器 /// private void SocketReConnect() { if (socket.Connected) { socket.Close(); } Thread.Sleep(10000); SocketConnect(); } /// /// 判断socket是否已连接 /// /// private bool checkSocket() { bool ret = true; bool isConnected = false; bool isRead = false; bool isWrite = false; bool isError = false; int avalSize = 0; try { isConnected = socket.Connected; isRead = socket.Poll(50, SelectMode.SelectRead); avalSize = socket.Available; isWrite = socket.Poll(50, SelectMode.SelectWrite); isError = socket.Poll(50, SelectMode.SelectError); if (isConnected == false || isError == true || (isRead == true && avalSize == 0)) { ret = false; } } catch (Exception e) { ret = false; } return ret; } #endregion /// /// 获取磅秤称重重量并解析 /// 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; string dataValue = "P", s_RecStr = ""; double d_RecStr = 0; try { if (checkSocket() == false) { //调用重连 Common.gd_gross_wt[scaleno - 1] = 0; DisplayInfo("【" + DateTime.Now.ToString() + "】磅秤连接已断开,重连..."); SocketReConnect(); return; } MsgSend = Encoding.UTF8.GetBytes(dataValue); if (socket.Connected) { // 向主机发送数据. socket.Send(MsgSend, MsgSend.Length, SocketFlags.None); //socket.Send(MsgSend); //DisplayInfo("发送信息:" + dataValue); //RecevieData = ""; // 接收主机应答 Int32 bytes = socket.Receive(MsgBuffer, MsgBuffer.Length, SocketFlags.None); StringBuilder buff = new StringBuilder(); if (bytes > 0) { // 将缓冲的字节数组,装换为字符串. // String receiveData = Encoding.ASCII.GetString(MsgBuffer, 0, bytes); s_RecStr = Encoding.ASCII.GetString(MsgBuffer, 0, bytes); if (s_RecStr.Length < 16) { Common.gd_gross_wt[scaleno - 1] = 0; DisplayInfo("【" + DateTime.Now.ToString() + "】无称重数据或者数据异常"); return; } s_RecStr = s_RecStr.Substring(1, 7); //for (int i = 0; i < s_RecStr.Length; i++) //{ // string s_nPos = s_RecStr.Substring(i, 1); // if (Common.ChkStrtoInt(s_nPos) && i != 5) // { // s_wt_Str += s_nPos; // } // else if (i == 5) // { // if (s_nPos == ".") // { // s_wt_Str += s_nPos; // } // else // { // Common.gd_gross_wt[scaleno - 1] = 0; // DisplayInfo("【" + DateTime.Now.ToString() + "】无称重数据或者数据异常"); // return; // } // } //} try { d_RecStr = Convert.ToDouble(s_RecStr); Common.gd_gross_wt[scaleno - 1] = d_RecStr; DisplayInfo("【" + DateTime.Now.ToString() + "】" + Common.gd_gross_wt[scaleno - 1] + " KG"); } catch { return; } //DisplayInfo("收到消息:" + receiveData); // AnalysisReceive(receiveData); //解析收到的数据 // 加入字符串缓存 //buff.Append(str); // 再次接受,看看后面还有没有数据. } } else { Common.gd_gross_wt[scaleno - 1] = 0; DisplayInfo("【" + DateTime.Now.ToString() + "】磅秤连接已断开,无法读取数据!"); } return; } 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() { SocketConnect(); while (threadFlag) { //if (spFlag) //{ GetScaleData(); //} //else //{ // DisplayInfo("【" + DateTime.Now.ToString() + "】打开串口" + portno + "失败,请检查"); // threadFlag = false; //} Thread.Sleep(400); } } } }