using Lskj.Business.Impl; using Lskj.Control; using Lskj.Core; using Lskj.Util; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Data.Common; using System.Data.SqlClient; using System.Drawing; using System.IO.Ports; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading; using System.Windows.Forms; using static Lskj.PubGetChipInfo.DllBaseClass; namespace Lskj.PubGetChipInfo { public partial class FrmMain : BaseForm { public DynamicGetChipInfoModel GetChipInfoModel; public SerialPort oneSerialPort = new SerialPort(); public Thread m_thread = null; public string m_strCom = ""; public int m_nBaud = 0; public bool m_bQuit = false; public FrmMain() { InitializeComponent(); this.Load += OnFrmMainLoad; this.btn_Read.Click += OnBtnReadClick; this.btn_Ok.Click += OnBtnOkClick; } /// /// 加载数据 /// /// /// private void OnFrmMainLoad(object sender, EventArgs e) { if (GetChipInfoModel.ChipType.Equals("1")) { lb_info.Text = "PRM序列号:"; } else if (GetChipInfoModel.ChipType.Equals("2")) { lb_info.Text = "授权芯片号:"; } string[] arryPort = SerialPort.GetPortNames(); foreach (string item in arryPort) { com_PortNum.Properties.Items.Add(item); } //设置串口 string portNum = IniHelper.Read(string.Format("PubGetChipInfo_PortNum_{0}", this.GetChipInfoModel.ModuleCode)); this.com_PortNum.Text = portNum; this.com_PortNum.SelectedIndexChanged += OnPortNumSelectedIndexChanged; //设置波特率 string bps = IniHelper.Read(string.Format("PubGetChipInfo_Bps_{0}", this.GetChipInfoModel.ModuleCode)); this.com_Bps.Text = bps; this.com_Bps.SelectedIndexChanged += OnBpsSelectedIndexChanged; } /// /// 读取按钮点击 /// /// /// private void OnBtnReadClick(object sender, EventArgs e) { if (GetChipInfoModel.ChipType.Equals("1")) { m_strCom = com_PortNum.Text; int.TryParse(com_Bps.Text, out m_nBaud); if (m_strCom.Length <= 0 || m_nBaud <= 0) { MessageUtil.Show("串口参数不全,请检查后重试!", MessageBoxButtons.OK); return; } if (m_thread != null && m_thread.IsAlive == true) { MessageUtil.Show("请倒计时结束后再重新读取!", MessageBoxButtons.OK); } else { txtEdit_info.Text = ""; m_bQuit = false; m_thread = new Thread(DoPRMAction); m_thread.Start(); } } else if (GetChipInfoModel.ChipType.Equals("2")) { m_strCom = com_PortNum.Text; int.TryParse(com_Bps.Text, out m_nBaud); if (m_strCom.Length <= 0 || m_nBaud <= 0) { MessageUtil.Show("串口参数不全,请检查后重试!", MessageBoxButtons.OK); return; } if (m_thread != null && m_bQuit == false) { MessageUtil.Show("请倒计时结束后再重新读取!", MessageBoxButtons.OK); } else { txtEdit_info.Text = ""; m_bQuit = false; m_thread = new Thread(Do2H1Action); m_thread.Start(); } } } /// /// 确认按钮点击 /// /// /// private void OnBtnOkClick(object sender, EventArgs e) { try { if (string.IsNullOrEmpty(txtEdit_info.Text)) { MessageUtil.Show("未获取到结果,无法保存"); return; } if (!string.IsNullOrEmpty(GetChipInfoModel.AfterSql)) { DataRow sourceRow = GetChipInfoModel.MaintabFocusedRow; ; string afterSql = GetChipInfoModel.AfterSql.TrimStart('!'); string pattern = @"(\w+)\((.*?)\)"; Regex regex = new Regex(pattern); Match match = regex.Match(afterSql); if (match.Success) { string functionName = match.Groups[1].Value; string parameters = match.Groups[2].Value; if (!string.IsNullOrEmpty(functionName)) { DataTable sqlParametersTab = BaseImpl.GetDataTableResult($"SELECT PARAMETER_NAME,PARAMETER_MODE,CHARACTER_MAXIMUM_LENGTH,DATA_TYPE FROM INFORMATION_SCHEMA.PARAMETERS WHERE SPECIFIC_NAME = '{functionName}' ORDER BY ORDINAL_POSITION;"); using (SqlCommand command = new SqlCommand(functionName, (SqlConnection)SqlHelper._connection)) { string[] parametersArray = parameters.Split(','); foreach (DataRow parameterRow in sqlParametersTab.Rows) { string parameterName = parameterRow["PARAMETER_NAME"] + ""; string parameterMode = parameterRow["PARAMETER_MODE"] + ""; int.TryParse(parameterRow["CHARACTER_MAXIMUM_LENGTH"] + "", out int dataLength); string dataType = parameterRow["DATA_TYPE"] + ""; SqlParameter sqlParameter = null; if (parameterMode.Equals("int")) { sqlParameter = new SqlParameter(parameterName, SqlDbType.Int); } else { sqlParameter = new SqlParameter(parameterName, SqlDbType.VarChar, dataLength); } if (parameterMode.Equals("IN")) { sqlParameter.Direction = ParameterDirection.Input; } else { sqlParameter.Direction = ParameterDirection.Output; } command.Parameters.Add(sqlParameter); } for (int i = 0; i < command.Parameters.Count; i++) { SqlParameter sqlParameter = command.Parameters[i]; if (parametersArray.Length > i) { string commandParameter = parametersArray[i]; string field = commandParameter.Replace("@", "").Replace("{", "").Replace("}", ""); string value = sourceRow.Table.Columns.Contains(field) ? sourceRow[field] + "" : commandParameter.Replace("@", ""); value = value.Replace("{result}", txtEdit_info.Text); value = value.Replace("@", "").Replace("{", "").Replace("}", ""); sqlParameter.Value = value; } } SqlParameter returnValue = new SqlParameter("@return", SqlDbType.Int, 4); returnValue.Direction = ParameterDirection.ReturnValue; command.Parameters.Add(returnValue); command.CommandType = CommandType.StoredProcedure; command.ExecuteNonQuery(); if ((returnValue.Value + "").Equals("1")) { DialogResult = DialogResult.OK; Close(); } else { SqlParameter outSqlParameter = command.Parameters.Cast().Where(n => n.Direction == ParameterDirection.Output).FirstOrDefault(); if (outSqlParameter != null) { string outMessage = outSqlParameter.Value + ""; if (!string.IsNullOrEmpty(outMessage)) { MessageUtil.Show(outSqlParameter.Value + ""); } } } }; } else { MessageUtil.Show("保存逻辑配置错误"); } } else { MessageUtil.Show("保存逻辑配置错误"); } } } catch (Exception ex) { MessageUtil.Show(ex.Message); } } /// /// 读取PRM芯片号 /// public void DoPRMAction() { try { oneSerialPort.ReadTimeout = 200; oneSerialPort.PortName = m_strCom; oneSerialPort.BaudRate = m_nBaud; if (oneSerialPort.IsOpen == false) { oneSerialPort.Open(); } } catch (Exception ex) { MessageUtil.Show(ex.Message); return; } long lCurTick = DateTime.Now.Ticks; int nCount = 10; SetCountDownText(nCount.ToString()); while (!m_bQuit) { try { if (nCount <= 0) { SetCountDownText("读取PRM序列号(&E)"); break; } if ((DateTime.Now.Ticks - lCurTick) > 1.0e7) { nCount--; SetCountDownText(nCount.ToString()); lCurTick = DateTime.Now.Ticks; } string message = oneSerialPort.ReadLine(); if (message.Contains("$PGDGI") && message.Contains("PRM") && message.Contains("SN")) { int nStart = message.IndexOf(':'); int nEnd = message.IndexOf('*'); SetInfoTxtEditText(message.Substring(nStart + 1, nEnd - nStart - 1)); SetCountDownText("读取PRM序列号(&E)"); break; } } catch { } } oneSerialPort.Close(); m_bQuit = true; } /// /// 读取授权芯片号 /// public void Do2H1Action() { try { oneSerialPort.ReadTimeout = 200; oneSerialPort.PortName = m_strCom; oneSerialPort.BaudRate = m_nBaud; if (oneSerialPort.IsOpen == false) { oneSerialPort.Open(); } } catch (Exception ex) { MessageUtil.Show(ex.Message); return; } oneSerialPort.Write("$CCTST,888888*00\r\n"); Thread.Sleep(100); long lCurTick = DateTime.Now.Ticks; int nCount = 10; SetCountDownText(nCount.ToString()); while (!m_bQuit) { try { if (nCount <= 0) { SetCountDownText("读取授权芯片号(&E)"); break; } if ((DateTime.Now.Ticks - lCurTick) > 1.0e7) { nCount--; SetCountDownText(nCount.ToString()); lCurTick = DateTime.Now.Ticks; oneSerialPort.Write("$CCRMO,ICN,2,0*00\r\n"); } string message = oneSerialPort.ReadLine(); if (message.Contains("$BDICN") && message.Contains("*")) { int nStart = message.IndexOf(','); int nEnd = message.IndexOf('*'); if (nEnd - nStart > 0) { SetInfoTxtEditText(message.Substring(nStart + 1, nEnd - nStart - 1)); SetCountDownText("读取授权芯片号(&E)"); m_bQuit = true; break; } } } catch { } } oneSerialPort.Close(); m_bQuit = true; } /// /// 设置倒计时文本值 /// /// private void SetCountDownText(string text) { if (btn_Read.InvokeRequired == true) { btn_Read.Invoke(new Action(() => { btn_Read.Text = text; })); } else { btn_Read.Text = text; } } /// /// 设置芯片文本值 /// /// private void SetInfoTxtEditText(string text) { if (txtEdit_info.InvokeRequired) {