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);
}
}
}
}