using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO.Ports;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
namespace Plugin.TestResult_WPF
{
public class BarcodeEventArg
{
public string name { get; private set; }
public string positionCode { get; private set; }
public string snrCode { get; private set; }
public BarcodeEventArg(string name, string positionCode, string snrCode)
{
this.name = name;
this.positionCode = positionCode;
this.snrCode = snrCode;
}
}
///
/// Scanner.xaml 的交互逻辑
///
public partial class Scanner : Window, INotifyPropertyChanged
{
#region ...
public event PropertyChangedEventHandler PropertyChanged;
public virtual void RaisePropertyChanged(string name)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
public void RaiseAndSetIfchanged(ref T old, T @new, [CallerMemberName] string propertyName = null)
{
old = @new;
if (propertyName != null) RaisePropertyChanged(propertyName);
}
#endregion
private string _title;
public string title
{
get { return _title; }
set => RaiseAndSetIfchanged(ref _title, value);
}
public event EventHandler FinishBarcode;
private DataTable dataTable;
SerialPort serialPort;
public Scanner(string title)
{
this.title = title;
this.DataContext = this;
InitializeComponent();
InitScanner();
}
///
/// 设置扫码枪
///
private void InitScanner()
{
string comStr = "";
if (serialPort != null) return;
if (this.title == "一区扫码")
{
comStr = "COM1";
}
else
{
comStr = "COM2";
}
// 配置串口
serialPort = new SerialPort
{
PortName = comStr,
BaudRate = 115200,
Parity = Parity.None,
DataBits = 8,
StopBits = StopBits.One,
Handshake = Handshake.None,
DtrEnable = true,
RtsEnable = true
//ReadTimeout = 500,
//WriteTimeout = 500,
//ReciveBufferSize=4096
};
try
{
// 打开串口
serialPort.Open();
// 注册接收数据事件
serialPort.DataReceived += SerialPort_DataReceived;
}
catch (Exception ex)
{
MessageBox.Show($"初始化扫码枪失败!{ex.StackTrace}");
}
}
private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
try
{
SerialPort sp = (SerialPort)sender;
string barcode = ReadDataFrom(sp);
//string barcode =
Dispatcher.Invoke(() =>
{
if (snrText.IsFocused)
{
snrText.Text = barcode;
Con_Click(null, null);
}
else
{
positionText.Text = barcode;
//positionText.Focus();
//snrText.Text = "";
snrText.Focus();
}
});
}
catch (Exception ex)
{
MessageBox.Show($"获取扫码枪数据失败!{ex.StackTrace}");
}
}
private void Con_Click(object sender, RoutedEventArgs e)
{
Dispatcher.Invoke(() =>
{
string position = positionText.Text, snr = snrText.Text;
if (string.IsNullOrEmpty(position) || string.IsNullOrEmpty(snr))
{
MessageBox.Show("请输入储位条码和产品条码");
return;
}
try
{
FinishBarcode.Invoke(this, new BarcodeEventArg(title, position, snr));
//positionText.Text = "";
//snrText.Text = "";
positionText.Focus();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
});
}
private void Ok_Click(object sender, RoutedEventArgs e)
{
string position = positionText.Text, snr = snrText.Text;
if (string.IsNullOrEmpty(position) || string.IsNullOrEmpty(snr))
{
MessageBox.Show("请输入储位条码和产品条码");
return;
}
try
{
FinishBarcode.Invoke(this, new BarcodeEventArg(title, position, snr));
this.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private string ReadDataFrom(SerialPort sp)
{
string barcode = "";
while (sp.BytesToRead > 0)
{
byte[] buffer = new byte[sp.BytesToRead];
sp.Read(buffer, 0, buffer.Length);
barcode += System.Text.Encoding.UTF8.GetString(buffer);
System.Threading.Thread.Sleep(50);
}
return barcode;
}
private void Window_Closing(object sender, CancelEventArgs e)
{
try
{
serialPort.Close();
}
catch (Exception ex)
{
}
}
}
}