using System; using System.IO; using System.IO.Ports; using System.Threading; namespace RailLocalMeter { public class RfidRailWayNo { Log lg = Log.GetInstance(); SerialPort serialPort1; bool blThreadFlag = false; private object obj = new object(); private Thread mThread = null; /// /// comPara是配置文件中的comPara /// /// public void StartThreadSweep(out string msg) { #region 串口采集配置 Parity parity = Parity.None; switch (AppConfigCache.comParity) { case "ODD": parity = Parity.Odd; break; case "EVEN": parity = Parity.Even; break; default: break; } StopBits stopBits = StopBits.None; switch (AppConfigCache.comStopBits) { case "1": stopBits = StopBits.One; break; case "1.5": stopBits = StopBits.OnePointFive; break; case "2": stopBits = StopBits.Two; break; default: break; } serialPort1 = new SerialPort(AppConfigCache.comPort, AppConfigCache.comBaud, parity, AppConfigCache.comLength, stopBits); int icnt = 0; msg = ""; while (!serialPort1.IsOpen) { try { icnt++; serialPort1.Open(); } catch (Exception err) { lg.WriteLog(LogType.RfidLoc, $"打开串口失败,正重试{err.Message}"); } System.Threading.Thread.Sleep(500); if (icnt > 5) { msg = "串口打开失败,请检查串口是否存在,且是否被占用"; return; } } #endregion blThreadFlag = true; mThread = new Thread(new ThreadStart(ThreadSweepInfo)); mThread.Start(); } private byte[] ReadPort(byte[] sendData) { serialPort1.Write(sendData, 0, sendData.Length); Thread.Sleep(50); byte[] recData = new byte[serialPort1.BytesToRead]; serialPort1.Read(recData, 0, recData.Length); return recData; } /// /// 扫码信息读取 /// /// private void ThreadSweepInfo() { try { bool isFirst = true; string strInfo = "", strTest = "", strOldNo = ""; //int iDx = 0; //bool isRight = false; //string[] strS = new string[3] { "T", "G", "Q" }; while (blThreadFlag) { lock (obj) { byte[] bt = ReadPort(new byte[] { 0x11 }); string strtmp = System.Text.Encoding.UTF8.GetString(bt); if (!string.IsNullOrEmpty(strtmp)) { if (isFirst) { strInfo = strtmp; isFirst = false; } else { strInfo += strtmp; if (strInfo.Length >= 20) { strOldNo = strInfo.Substring(0, 20); if (CacleCls.rfidCarNo != strOldNo) { CacleCls.rfidCarNo = strOldNo; lg.WriteLog(LogType.RfidLoc, $"提供给界面的读卡器数据:{strInfo.Substring(0, 20)}"); if (strInfo.Length > 20) strInfo = strInfo.Substring(20); else strInfo = ""; } } } #region 注释 /* strInfo += strtmp; if (strInfo.Length >= 40) { foreach (string s in strS) { iDx = strInfo.IndexOf(s); if (iDx >= 0 && (iDx + 20) < strInfo.Length) { string st = strInfo.Substring(strInfo.IndexOf(s), 20); string ms = strInfo.Substring((iDx + 20)); if (st.Substring(0, ms.Length) == ms) { if (CacleCls.rfidCarNo != st) { CacleCls.rfidCarNo = st; lg.WriteLog(LogType.RfidLoc, $"提供给界面的读卡器数据:{st}"); } isRight = true; break; } } } if (!isRight) { strInfo = ""; iDx = 0; } } //*/ /* if (strInfo == "") { if (strtmp.IndexOf("T") == 0 || strtmp.IndexOf("Q") == 0 || strtmp.IndexOf("G") == 0) { strInfo = strtmp; } else { strInfo = ""; } } else if (strInfo.Length < 20) { strInfo += strtmp; if (strInfo.Length > 20) strInfo = strInfo.Substring(0, 20); } if (strInfo.Length == 20) { if (CacleCls.rfidCarNo != strInfo) { CacleCls.rfidCarNo = strInfo; lg.WriteLog(LogType.RfidLoc, $"提供给界面的读卡器数据:{strInfo}"); } strInfo = ""; } //*/ /* if ((strtmp.IndexOf("T") == 0 || strtmp.IndexOf("Q") == 0 || strtmp.IndexOf("G") == 0) && strtmp.Length > 14) { if (CacleCls.rfidCarNo != strtmp && strtmp.Trim() != "") { CacleCls.rfidCarNo = strtmp; lg.WriteLog(LogType.RfidLoc, $"获取并提供给界面的读卡器数据:{strtmp}"); } } else { lg.WriteLog(LogType.RfidLoc, $"读卡器读取的数据:{strtmp}"); } //*/ #endregion strTest += strtmp; if (strTest.Length >= 100) { lg.WriteLog(LogType.RfidLoc, $"读卡器读取的数据:{strTest}"); strTest = ""; } } else { isFirst = true; strInfo = ""; } } } } catch (Exception exp) { lg.WriteLog(LogType.RfidLoc, $"读卡器数据读取异常:{exp.Message}"); } } /// /// 关闭线程 /// /// public bool CloseThread() { try { blThreadFlag = false; Close(); return true; } catch { return false; } } /// /// 关闭扫描枪 /// private void Close() { lg.WriteLog(LogType.RfidLoc, $"读卡器关闭"); if (serialPort1 != null && serialPort1.IsOpen) serialPort1.Close(); } } }