Работа с несколькими 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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4.111 из 5
Похожие ответы