yusijie
2024-07-08 00e25e4a9c9bd2fc91558c3c1a68f47db6d08b1d
WarM/ÌõÂë´òÓ¡/Kf_WeighToBarCode.cs
@@ -11,6 +11,11 @@
using System.Threading;
using System.IO;
using Pub_Class;
using System.IO.Ports;
using System.Linq;
using System.IO.Ports;
using System.Linq;
namespace WarM
{
@@ -50,6 +55,13 @@
        public DBUtility.ClsPub.Enum_BillStatus BillStatus;
        SQLHelper.ClsCN oCn = new SQLHelper.ClsCN();
        private static string repeatData = string.Empty;
        private SerialPort ComDevice = null;
        private int HGetWeight = 0;
        private string Message = "";
        private int timeIndex = 0;
        #region  //固定代码
        //清空界面
@@ -62,6 +74,9 @@
            grdMain.DataSource = null;
            grdSub.DataSource = null;
            chkHDYFlag.Checked = true;
            //读取 æ‰“开串口的配置信息
            readParams();
        }
        //窗体加载
@@ -176,6 +191,228 @@
            DBUtility.Xt_BaseBillFun.DefaultGridView(grdMain, this.Name);
            DBUtility.Xt_BaseBillFun.DefaultGridView(grdSub, this.Name + "grdSub");
        }
        //打开串口
        private void button3_Click(object sender, EventArgs e)
        {
            OpenCom();
        }
        public void OpenCom()
        {
            //初始化串口
            ComDevice = new SerialPort();
            ComDevice.DataReceived += new SerialDataReceivedEventHandler(Com_DataReceived);//绑定事件
            string[] PortNames = SerialPort.GetPortNames();
            if (!ComDevice.IsOpen)
            {
                try
                {
                    ComDevice.PortName = txtPortName.Text;
                    ComDevice.BaudRate = int.Parse(txtBaudRate.Text);
                    switch (cmbParity.SelectedItem.ToString())
                    {
                        case "0":
                            ComDevice.Parity = Parity.None;
                            break;
                        case "1":
                            ComDevice.Parity = Parity.Odd;
                            break;
                        case "2":
                            ComDevice.Parity = Parity.Even;
                            break;
                        case "3":
                            ComDevice.Parity = Parity.Mark;
                            break;
                        case "4":
                            ComDevice.Parity = Parity.Space;
                            break;
                        default:
                            break;
                    }
                    ComDevice.DataBits = int.Parse(txtDataBits.Text);
                    switch (cmbStopBits.SelectedItem.ToString())
                    {
                        case "0":
                            ComDevice.StopBits = StopBits.None;
                            break;
                        case "1":
                            ComDevice.StopBits = StopBits.One;
                            break;
                        case "2":
                            ComDevice.StopBits = StopBits.Two;
                            break;
                        case "1.5":
                            ComDevice.StopBits = StopBits.OnePointFive;
                            break;
                        default:
                            break;
                    }
                    ComDevice.Open();
                    //lblComStatus.Text = "串口状态:开启";
                    timer3.Enabled = true;
                }
                catch (Exception ex)
                {
                    MessageBox.Show("打开串口失败!" + ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
            }
            else
            {
            }
        }
        //关闭串口
        private void button2_Click(object sender, EventArgs e)
        {
            CloseCom();
        }
        public void CloseCom()
        {
            if (!ComDevice.IsOpen)
            {
            }
            else
            {
                try
                {
                    timer3.Enabled = false;
                    Thread.Sleep(100);
                    ComDevice.Close();
                    //   valueCounts = new Dictionary<string, int>();
                    // lblComStatus.Text = "串口状态:关闭";
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
            }
        }
        //发送数据
        public bool SendData(byte[] data)
        {
            if (ComDevice.IsOpen)
            {
                try
                {
                    ComDevice.Write(data, 0, data.Length);//发送数据
                    return true;
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                finally
                {
                }
            }
            else
            {
                MessageBox.Show("串口未打开", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            return false;
        }
        //接收数据
        private void Com_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            //if (!ComDevice.IsOpen)
            //    {
            //        return;
            //    }
            //    Thread.Sleep(100);
            if (HGetWeight == 1)
            {
                byte[] ReDatas = new byte[ComDevice.BytesToRead];
                ComDevice.Read(ReDatas, 0, ReDatas.Length);//读取数据
                this.AddData(ReDatas);//输出数据
            }
        }
        //处理接收到的数据
        public void AddData(byte[] data)
        {
            //Thread.Sleep(100);
            StringBuilder sb = new StringBuilder();
            sb.Append(Encoding.ASCII.GetString(data));
            var str = sb.ToString();
            str = str.Replace("w", "").Replace("n", "").Replace("kg\r\n", ";");
            if (str != repeatData)
            {
                repeatData = str;
                string[] strArray = str.Split(';');
                for (int i = 0; i < strArray.Length; i++)
                {
                    if (double.TryParse(strArray[i], out double ret))//判断是否是数字
                    {
                        Message += double.Parse(strArray[i]) + ";";
                        //UpdateLabel(ret.ToString());
                    }
                }
            }
        }
        //获取数组中出现频率最高的数据
        private string getMostStr(string message)
        {
            string[] strArray = message.Split(';');
            // ä½¿ç”¨LINQ查询出现次数最多的元素
            var maxElement = strArray.GroupBy(x => x)
                                  .OrderByDescending(g => g.Count())
                                  .First()
                                  .Key;
            return maxElement;
        }
        //依据线程,将数据写入界面组件
        private void UpdateLabel(string text)
        {
            if (txtHWeightQyt.InvokeRequired)
            {
                // åœ¨UI线程上调用 UpdateLabel
                txtHWeightQyt.Invoke(new Action<string>(UpdateLabel), text);
            }
            else
            {
                // ç›´æŽ¥æ›´æ–° txtHWeightQyt.Text
                txtHWeightQyt.Text = text;
            }
        }
        //获取数据按钮,启动计时器
        private void button4_Click(object sender, EventArgs e)
        {
            HGetWeight = 1;
            timer2.Enabled = true;
        }
        //计时器事件
        private void timer2_Tick(object sender, EventArgs e)
        {
        }
        #endregion
@@ -383,7 +620,13 @@
        private void tc_Click(object sender, EventArgs e)
        {
            this.Close();
            //退出时关闭串口
            if (ComDevice != null)
            {
                CloseCom();
            }
            this.Close();
        }
        #endregion
@@ -1030,13 +1273,315 @@
            }
        }
        #endregion
        #region è¯»å–设备称重信息
        private static string repeatData = string.Empty;
        private SerialPort ComDevice = null;
        private int HGetWeight = 0;
        private string Message = "";
        private int timeIndex = 0;
        private string value_COM = "";              //COM
        private string value_BaudRate = "9600";     //比特率
        private string value_StopBits = "1";        //停止位
        private string value_Parity = "0";          //校验位
        private string value_DataBits = "8";        //数据位
        #region æ‰“开串口按钮触发事件
        private void button_OpenCom_Click(object sender, EventArgs e)
        {
            value_COM = textBox_COM.Text;
            OpenCom();
        }
        #endregion
        #region æ‰“开串口
        public void OpenCom()
        {
            //初始化串口
            ComDevice = new SerialPort();
            ComDevice.DataReceived += new SerialDataReceivedEventHandler(Com_DataReceived);//绑定事件
            string[] PortNames = SerialPort.GetPortNames();
            if (!ComDevice.IsOpen)
            {
                try
                {
                    ComDevice.PortName = value_COM;
                    ComDevice.BaudRate = int.Parse(value_BaudRate);
                    switch (value_Parity)
                    {
                        case "0":
                            ComDevice.Parity = Parity.None;
                            break;
                        case "1":
                            ComDevice.Parity = Parity.Odd;
                            break;
                        case "2":
                            ComDevice.Parity = Parity.Even;
                            break;
                        case "3":
                            ComDevice.Parity = Parity.Mark;
                            break;
                        case "4":
                            ComDevice.Parity = Parity.Space;
                            break;
                        default:
                            break;
                    }
                    ComDevice.DataBits = int.Parse(value_DataBits);
                    switch (value_StopBits)
                    {
                        case "0":
                            ComDevice.StopBits = StopBits.None;
                            break;
                        case "1":
                            ComDevice.StopBits = StopBits.One;
                            break;
                        case "2":
                            ComDevice.StopBits = StopBits.Two;
                            break;
                        case "1.5":
                            ComDevice.StopBits = StopBits.OnePointFive;
                            break;
                        default:
                            break;
                    }
                    ComDevice.Open();
                    MessageBox.Show("串口打开成功!");
                    //保存串口的配置信息
                    saveParams();
                }
                catch (Exception ex)
                {
                    MessageBox.Show("打开串口失败!" + ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
            }
            else
            {
            }
        }
        #endregion
        #region å…³é—­ä¸²å£
        public void CloseCom()
        {
            if (!ComDevice.IsOpen)
            {
                MessageBox.Show("串口关闭失败!当前串口未打开!");
            }
            else
            {
                try
                {
                    Thread.Sleep(100);
                    ComDevice.Close();
                    MessageBox.Show("串口关闭成功!");
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
            }
        }
        #endregion
        #region æŽ¥æ”¶æ•°æ®
        private void Com_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            if (HGetWeight == 1)
            {
                byte[] ReDatas = new byte[ComDevice.BytesToRead];
                ComDevice.Read(ReDatas, 0, ReDatas.Length);//读取数据
                this.AddData(ReDatas);//输出数据
            }
        }
        #endregion
        #region å¤„理接收到的数据
        public void AddData(byte[] data)
        {
            StringBuilder sb = new StringBuilder();
            sb.Append(Encoding.ASCII.GetString(data));
            var str = sb.ToString();
            str = str.Replace("w", "").Replace("n", "").Replace("kg\r\n", ";");
            if (str != repeatData)
            {
                repeatData = str;
                string[] strArray = str.Split(';');
                for (int i = 0; i < strArray.Length; i++)
                {
                    if (double.TryParse(strArray[i], out double ret))//判断是否是数字
                    {
                        //保留一位小数
                        double temp = double.Parse(strArray[i]);
                        temp = Math.Round(temp,1);
                        Message += double.Parse(strArray[i]) + ";";
                    }
                }
            }
        }
        #endregion
        #region èŽ·å–æ•°ç»„ä¸­å‡ºçŽ°é¢‘çŽ‡æœ€é«˜çš„æ•°æ®
        private string getMostStr(string message)
        {
            string[] strArray = message.Split(';');
            // ä½¿ç”¨LINQ查询出现次数最多的元素
            var maxElement = strArray.GroupBy(x => x)
                                  .OrderByDescending(g => g.Count())
                                  .First()
                                  .Key;
            return maxElement;
        }
        #endregion
        #region è®¡æ—¶å™¨è§¦å‘事件,用于获取时间间隔内接收到的数据
        private void timer2_Tick(object sender, EventArgs e)
        {
            if (timeIndex == 0)
            {
                timeIndex = 1;
            }
            else
            {
                timer2.Enabled = false;
                string str = getMostStr(Message);
                txtHWeightQyt.Text = str;
                Message = "";
                timeIndex = 0;
                HGetWeight = 0;
            }
        }
        #endregion
        #region ç§°é‡æŒ‰é’®è§¦å‘事件
        private void button_getHWeight_Click(object sender, EventArgs e)
        {
            HGetWeight = 1;
            timer2.Enabled = true;
        }
        #endregion
        #region ä¿å­˜é…ç½®ä¿¡æ¯
        //写入配置参数
        private void saveParams()
        {
            //判断文件是否存在
            if (!File.Exists(Application.StartupPath + "//Kf_WeightToBarCodeParams.txt"))
            {
                FileStream fs1 = new FileStream(Application.StartupPath + "//Kf_WeightToBarCodeParams.txt", FileMode.Create, FileAccess.Write);//创建写入文件
                StreamWriter sw = new StreamWriter(fs1);
                sw.WriteLine(value_COM);//开始写入值
                sw.WriteLine(value_BaudRate);
                sw.WriteLine(value_StopBits);
                sw.WriteLine(value_Parity);
                sw.WriteLine(value_DataBits);
                sw.Close();
                fs1.Close();
            }
            else
            {
                FileStream fs1 = new FileStream(Application.StartupPath + "//Kf_WeightToBarCodeParams.txt", FileMode.Create, FileAccess.Write);//创建写入文件
                StreamWriter sw = new StreamWriter(fs1);
                sw.WriteLine(value_COM);//开始写入值
                sw.WriteLine(value_BaudRate);
                sw.WriteLine(value_StopBits);
                sw.WriteLine(value_Parity);
                sw.WriteLine(value_DataBits);
                sw.Close();
                fs1.Close();
            }
        }
        #endregion
        #region è¯»å–配置信息
        //读取配置文件
        private void readParams()
        {
            //关闭串口
            //CloseCom();
            if (File.Exists(Application.StartupPath + "//Kf_WeightToBarCodeParams.txt"))
            {
                //读取文件值并显示到窗体
                FileStream fs = new FileStream(Application.StartupPath + "//Kf_WeightToBarCodeParams.txt", FileMode.Open, FileAccess.ReadWrite);
                StreamReader sr = new StreamReader(fs);
                string line = sr.ReadLine();
                int curLine = 0;
                while (line != null)
                {
                    if (++curLine == 1)
                    {
                        value_COM = line;
                        textBox_COM.Text = value_COM;
                    }
                    else if (curLine == 2)
                    {
                        value_BaudRate = line;
                    }
                    else if (curLine == 3)
                    {
                        value_StopBits = line;
                    }
                    else if (curLine == 4)
                    {
                        value_Parity = line;
                    }
                    else if (curLine == 5)
                    {
                        value_DataBits = line;
                    }
                    else
                    {
                    }
                    line = sr.ReadLine();
                }
                sr.Close();
                fs.Close();
            }
        }
        #endregion
        #endregion
    }
}