屠宰场客户端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

160 lines
4.2 KiB

using BWP.WinFormControl;
using BWP.WinFormControl.WeightDataFormat;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace ButcherWeight
{
partial class WeightForm
{
private IDataFormat _dataFormat;
private Thread _inQueryThread;
private bool _mainProcessIsRun;
readonly StringBuilder _dataStrBuilder = new StringBuilder();
void OpenSerialPort()
{
if (enableCheckBox.Checked)
return;
if (WeightContext.Config.RateSet == null)
throw new Exception("请先配置称相关信息");
weightSerialPort.PortName = WeightContext.Config.ComSet;
weightSerialPort.BaudRate = WeightContext.Config.RateSet.Value;
weightSerialPort.DataBits = WeightContext.Config.BitSet.Value;
weightSerialPort.ReadBufferSize = 4096 * 100;
if (!string.IsNullOrEmpty(WeightContext.Config.Format))
format = "{0:{format}}".Replace("{format}", WeightContext.Config.Format);
switch (WeightContext.Config.WeightSet)
{
case "IND560":
_dataFormat = new IND560DataFormat();
break;
case "Xk3124":
_dataFormat = new Xk3124DataFormat();
break;
case "Xk3190A9":
_dataFormat = new Xk3190A9DataFormat();
break;
default:
_dataFormat = new Xk3190D10DataFormat();
break;
}
if (!weightSerialPort.IsOpen)
{
try
{
weightSerialPort.Open();
}
catch (InvalidOperationException)
{
MessageBox.Show(@"指定的端口已打开");
}
catch (UnauthorizedAccessException)
{
MessageBox.Show(@"对端口的访问被拒绝");
}
}
}
void ReadData()
{
_inQueryThread = new Thread(InQuery);
_inQueryThread.Start();
}
string format = "{0:0.00}";
private void InQuery()
{
while (_mainProcessIsRun)
{
int availableCount = weightSerialPort.BytesToRead;
if (availableCount == 0)
{
Thread.Sleep(1);
}
char[] buffer = new char[availableCount];
if (!weightSerialPort.IsOpen)
{
continue;
}
weightSerialPort.Read(buffer, 0, availableCount);
foreach (var c in buffer)
{
if (c == _dataFormat.Beginchar)
{
_dataStrBuilder.Clear();
_dataStrBuilder.Append(c);
}
else if (c == _dataFormat.Endchar || _dataStrBuilder.Length == _dataFormat.DataLength - 1)
{
_dataStrBuilder.Append(c);
bool isStatic;
string str;
if (_dataFormat.ParseAscii(_dataStrBuilder.ToString(), out str, out isStatic))
{
if (string.IsNullOrEmpty(str))
str = "0";
this.Invoke(new InvokeHandler(delegate()
{
weightLabel.Text = string.Format(format, decimal.Parse(str));
}));
}
_dataStrBuilder.Clear();
}
else if (_dataStrBuilder.Length != 0)
{
_dataStrBuilder.Append(c);
}
}
}
}
void DisableWeight()
{
_mainProcessIsRun = false;
WeightValue = 0;
format = "{0:0.00}";
Thread.Sleep(10);
if (_inQueryThread.IsAlive)
{
_inQueryThread.Abort();
}
if (weightSerialPort.IsOpen)
weightSerialPort.Close();
}
public void enableCheckBox_Click(object sender, EventArgs e)
{
if (!enableCheckBox.Checked)
{
OpenSerialPort();
_mainProcessIsRun = true;
ReadData();
}
else
DisableWeight();
enableCheckBox.CheckState = enableCheckBox.Checked ? CheckState.Unchecked : CheckState.Checked;
readMaoBtn.Enabled = readPiBtn.Enabled = enableCheckBox.Checked;
}
decimal? WeightValue
{
get
{
if (!string.IsNullOrEmpty(weightLabel.Text))
return decimal.Parse(weightLabel.Text);
return null;
}
set { weightLabel.Text = string.Format(format, value); }
}
}
}