Работа с несколькими COM портами: переписать код для работы с одним - C#
Формулировка задачи:
в общем необходима программа для опроса нескольких компортов. есть код, но он работает для нескольких компортов. а вот у меня ОДИН компорт и на него надо слать несколько значений. кто работал, отзовитесь, помогите советом\кодом
#region com private void SelectCom() //com port { try { NpgsqlConnection conn = new NpgsqlConnection(("Server=" + list[0] + ";Port=" + list[1] + ";User Id=" + list[2] + ";Password=" + list[3] + ";Database=" + list[4] + ";")); // string sql = "SELECT \"ID_TagName\", \"F_ComPort\", \"F_ComPortBaudRate\", \"F_ComQuery\", \"F_ParseFunction\", \"F_TagReadTime\", \"F_AnswerLenght\", \"F_AnswerKey\", "; sql += "\"F_AnswerKeyPosition\", \"F_ComPortIPAdress\", \"F_ComPortParity\", \"F_ComPortDataBits\", \"F_ComPortStopBit\", \"F_ComPortFlowControl\", "; sql += "\"F_ComPortTimeOut\" FROM \"SC_Tag\".\"T_TagName\" as tn,\"SC_Tag\".\"T_HardWareTag\" as hw , \"SC_Tag\".\"T_RealHardWare\" as rh where "; sql += "rh.\"ID_RealHardWare\" = hw.\"F_RealHardWare_ID\" and tn.\"F_HardWare_ID\" = hw.\"F_TagName_ID\" and \"F_ServerName\" =\'" + Environment.MachineName + "\' and \"F_ComPortIPAdress\" = '127.0.0.1' "; NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, conn); ds.Reset(); da.Fill(ds); dt = ds.Tables[0]; if (ds.Tables[0] != null) { InitAll(); } } catch (Exception msg) { logger.Trace(msg); return; } } private void InitAll() { try { allListeners = new List<MyComReader>(); for (int xx = 0; xx < ds.Tables[0].Rows.Count; ++xx) { string com = "COM" + dt.Rows[xx][1]; string send = dt.Rows[xx][3].ToString() + "\r"; string idcom = dt.Rows[xx][0].ToString(); int BaudRate = Convert.ToInt32(dt.Rows[xx][2]); char key = Convert.ToChar(dt.Rows[xx][7]); string parity = dt.Rows[xx][10].ToString(); int databit = Convert.ToInt32(dt.Rows[xx][11]); double stopbit = Convert.ToDouble(dt.Rows[xx][12]); string flowcontrol = dt.Rows[xx][13].ToString(); int timeout = Convert.ToInt32(dt.Rows[xx][14]); string parseFunc = dt.Rows[xx][4].ToString(); allListeners.Add(new MyComReader(com, BaudRate, send, idcom, parity, databit, stopbit, flowcontrol, timeout, parseFunc, key)); } min = Convert.ToInt32(dt.Rows[0][5]); for (int i = 0; i < ds.Tables[0].Rows.Count; i++) { if (Convert.ToInt32(dt.Rows[i][5]) < min) min = Convert.ToInt32(dt.Rows[i][5]); } this.timer2 = new System.Timers.Timer(); this.timer2.Enabled = true; this.timer2.Interval = min; this.timer2.Elapsed += new System.Timers.ElapsedEventHandler(this.timer2_Elapsed); this.timer2.AutoReset = true; this.timer2.Start(); } catch (Exception msg) { logger.Trace(msg); return; } } private void timer2_Elapsed(object sender, EventArgs e) { try { Go(); } catch (Exception msg) { logger.Trace(msg); throw; } } private void Go() { try { foreach (MyComReader comListener in allListeners) { comListener.ThreadStart(); Thread.Sleep(1000); if (comListener.ThreadState()) comListener.ThreadStop(); } } catch (Exception msg) { logger.Trace(msg); return; } } #endregion
Решение задачи: «Работа с несколькими COM портами: переписать код для работы с одним»
textual
Листинг программы
#region mycom internal class MyComReader { // private SerialPort port; private System.Timers.Timer timer; private System.Threading.Thread thread; readonly EventWaitHandle wh = new AutoResetEvent(false); private bool doWork; // int i = 0; string value = ""; private string inData = ""; SerialPort _COM; string DataToSend; string IdCom; string ParseGlob = ""; char Key; internal MyComReader(string portNumber, int bodRate, string dataTosend, string idcom, string parity, int databit, double stopbit, string flowcontrol, int timeout, string parse, char key) { IdCom = idcom; DataToSend = dataTosend; Key = key; _COM = new SerialPort(portNumber, bodRate); if (parity.ToLower() == "none") _COM.Parity = System.IO.Ports.Parity.None; else if (parity.ToLower() == "even") _COM.Parity = System.IO.Ports.Parity.Even; else if (parity.ToLower() == "mark") _COM.Parity = System.IO.Ports.Parity.Mark; else if (parity.ToLower() == "odd") _COM.Parity = System.IO.Ports.Parity.Odd; else if (parity.ToLower() == "space") _COM.Parity = System.IO.Ports.Parity.Space; _COM.DataBits = databit; if (stopbit == 0) _COM.StopBits = StopBits.None; else if (stopbit == 1) _COM.StopBits = StopBits.One; else if (stopbit == 1.5) _COM.StopBits = StopBits.OnePointFive; else if (stopbit == 2) _COM.StopBits = StopBits.Two; if (flowcontrol.ToLower() == "none") _COM.Handshake = Handshake.None; else if (flowcontrol.ToLower() == "rts/cts" || flowcontrol.ToLower() == "rts\\cts") _COM.Handshake = Handshake.RequestToSend; else if (flowcontrol.ToLower() == "xon/xof" || flowcontrol.ToLower() == "xon\\xof") _COM.Handshake = Handshake.RequestToSendXOnXOff; else if (flowcontrol.ToLower() == "dtr/dsr" || flowcontrol.ToLower() == "dtr\\dsr") _COM.Handshake = Handshake.XOnXOff; _COM.ReadTimeout = timeout; _COM.WriteTimeout = timeout; if (parse != "") ParseGlob = parse; _COM.DataReceived += port_DataReceived; } public void ThreadStart() { doWork = true; thread = new Thread(Execute); thread.Start(); this.timer = new System.Timers.Timer(); this.timer.Enabled = true; this.timer.Interval = min; this.timer.Elapsed += new System.Timers.ElapsedEventHandler(this.timer_Elapsed); this.timer.AutoReset = true; this.timer.Start(); } public void ThreadStop() { doWork = false; timer.Stop(); wh.Set(); _COM.Close(); } public bool ThreadState() { if (doWork) return true; else return false; } void Execute() { try { while (doWork) { if (_COM.IsOpen) { // Если порт открыт, значит какой-то косяк, девайс не ответил, здесь обрабатываем // Закрываем _COM.Close(); } // Открываем _COM.Open(); _COM.Write(DataToSend); wh.WaitOne(); } } catch (Exception msg) { logger.Debug("Execute() " + msg); return; } } void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { wh.Set(); } void port_DataReceived(object sender, SerialDataReceivedEventArgs e) { try { //////////// SerialPort sp = (SerialPort)sender; inData += sp.ReadExisting(); value = inData; // if (value.Length == 14 && value.Length < 15 && value.Contains("\r")) if (value[0] == Key && value.Length == 14 && value.Contains("\r")) { value = value.Substring(0, value.Length - 1); // Пришли данные // string IdCom = "2"; // Чето с ними делаем NpgsqlConnection conn = new NpgsqlConnection(("Server=" + list[0] + ";Port=" + list[1] + ";User Id=" + list[2] + ";Password=" + list[3] + ";Database=" + list[4] + ";")); conn.Open(); if (ParseGlob != "") Mystr = ("INSERT INTO " + list[5] + "(\"F_TagName_ID\"," + list[9] + ",\"F_Date\") VALUES (" + IdCom + ",(SELECT * FROM " + ParseGlob + "(\'" + value + "\')),\'" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "\' )"); else Mystr = ("INSERT INTO " + list[5] + "(\"F_TagName_ID\"," + list[9] + ",\"F_Date\") VALUES (" + IdCom + ",\'" + value + "\',\'" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "\' )"); // MessageBox.Show(Mystr); NpgsqlCommand command = new NpgsqlCommand(Mystr, conn); int rowsaffected; rowsaffected = command.ExecuteNonQuery(); conn.Close(); inData = ""; // logger.Info("ok "+ value); value = ""; } else { logger.Debug("port_DataReceived "+value); value = ""; inData = ""; return; } // проверка, если в InData появилась полная строка - отрезаем кусок // и обрабатываем, а лучше в другой поток для обработки передаем //////// } catch (Exception msg) { logger.Debug(msg); logger.Debug(Mystr); return; } } } #endregion
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д