powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Com port работа с несколькими
43 сообщений из 43, показаны все 2 страниц
Com port работа с несколькими
    #38665875
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в общем и целом умею работать с ком портом. но необходимо организовать перебор указанных ком портов и все их опросить
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
#region comport
        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\", \"ID_RealHardWare\",   \"F_ParseFunction\",   \"F_ComQuery\",   \"F_AnswerLenght\",   \"F_AnswerKey\",   \"F_AnswerKeyPosition\",   \"F_ComPort\",   \"F_ComPortIPAdress\",   \"F_ComPortBaudRate\",   \"F_ComPortParity\",   \"F_ComPortDataBits\",   \"F_ComPortStopBit\",   \"F_ComPortFlowControl\",   \"F_ComPortTimeOut\" ,  \"ID_HardWareTag\",   \"F_OPCServerName\",   \"F_IDOPCTag\", \"F_TagReadTime\",   \"Transmit\",   \"F_RealHardWare_ID\" FROM  \"SC_Tag\".\"T_TagName\" as tn,\"SC_Tag\".\"T_HardWareTag\" as hw , \"SC_Tag\".\"T_RealHardWare\" as rh where  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\' ";
                //   string sql = "  SELECT \"F_name\", \"F_OPCServerName\", \"F_IDOPCTag\", \"F_TagReadTime\",  \"ID_TagName\"   FROM \"SC_Tag\".\"T_TagName\" as tn, \"SC_Tag\".\"T_HardWareTag\" as hw  where tn.\"F_HardWare_ID\" = hw.\"ID_HardWareTag\"    and \"F_ServerName\"  =\'" + Environment.MachineName + "\' ";

                NpgsqlDataAdapter da3 = new NpgsqlDataAdapter(sql, conn);
                //textBox1.Text = sql;
                ds3.Reset();
                da3.Fill(ds3);
                dt3 = ds3.Tables[0];
                dataGridView3.DataSource = dt3;
                if (ds3.Tables[0] != null)
                {

                    min = Convert.ToInt32(dt3.Rows[0][14]);
                    for (int i = 0; i < ds3.Tables[0].Rows.Count; i++)
                    {
                        if (Convert.ToInt32(dt3.Rows[i][14]) < min)
                            min = Convert.ToInt32(dt3.Rows[i][14]);
                    }
                    this.timer4.Interval = min;
                    // Таймер
                    Timer timer = new Timer();
                    // Порт
                    //      SerialPort port = new SerialPort("COM2", 9600, System.IO.Ports.Parity.None, 8, System.IO.Ports.StopBits.One); 
                    for (int xx = 0; xx < ds3.Tables[0].Rows.Count; ++xx)
                    {
                       

                    }
                    // Задаем интервал таймеру
                    timer4.Interval = min;
                    // Подписываемся на тики таймера
                    timer4.Tick += new EventHandler(timer1_Tick);
                    // Стартуем таймер
                    timer4.Start();
                }
        
            }
            catch (Exception msg)
            {
                MessageBox.Show(msg.ToString() + " Select()");
                this.file.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss\t Select()") + msg.ToString());
                this.file.Flush();
                return;
            }
        }
        private void timer4_Tick(object sender, EventArgs e)
        {
            for (int xx = 0; xx < ds3.Tables[0].Rows.Count; ++xx)
            {
                string com = "COM" + dt3.Rows[xx][7];
                send = dt3.Rows[xx][3].ToString() + "\r";
                port = new SerialPort(com, 9600, System.IO.Ports.Parity.None, 8, System.IO.Ports.StopBits.One);
                // Открываем порт
                if (port.IsOpen)
                {
                    // Если порт открыт, значит какой-то косяк, девайс не ответил, здесь обрабатываем

                    // Закрываем
                    port.Close();
                }

                // Открываем
                port.Open();

                port.Write(send);
            }
        }

        int icom = 0;
        // Пришли данные
        void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            try
            {
           

                for (int xx = 0; xx < ds3.Tables[0].Rows.Count; ++xx)
                {
                   
                  

                    System.Threading.Thread.Sleep(100);
                    // Получаем пришедшие данные
                    string indata = port.ReadExisting();

                    // Чето с ними делаем
                    //MessageBox.Show(icom++.ToString() + " " + indata);
                    //  textBox1.Text = indata;
                    //   this.Text = i++.ToString();
                    NpgsqlConnection conn = new NpgsqlConnection(("Server=" + list[0] + ";Port=" + list[1] + ";User Id=" + list[2] + ";Password=" + list[3] + ";Database=" + list[4] + ";"));
                    conn.Open();
                    String Mystr = ("INSERT INTO " + list[5] + "(\"F_TagName_ID\",\"F_Value\",\"F_Date\")  VALUES (" + dt3.Rows[xx][0].ToString() + ",\'" + indata + "\',\'" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "\'   )");
                    //  MessageBox.Show(Mystr);
                    textBox1.Text = Mystr;
                    NpgsqlCommand command = new NpgsqlCommand(Mystr, conn);
                    int rowsaffected;
                    rowsaffected = command.ExecuteNonQuery();
                    conn.Close();

                    /*    if (port.BytesToRead > 0)
                        {
                            byte[] data = new byte[port.BytesToRead];
                            port.Read(data, 0, port.BytesToRead);
                            ASCIIEncoding ascii = new ASCIIEncoding();
                            String decoded = ascii.GetString(data);
                            MessageBox.Show ( decoded + " i: " + i++.ToString());


                        }*/
                    // Закрываем порт
                    if (port.IsOpen)
                    {
                        // Если порт открыт, значит какой-то косяк, девайс не ответил, здесь обрабатываем

                        // Закрываем
                        port.Close();
                    }
                }
            }
            catch (Exception msg)
            {
                  MessageBox.Show(msg.ToString() + "TagIntoNPG()");
                this.file.WriteLine(DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss\t TagIntoNPG()") + msg.ToString());
                this.file.Flush();
                // AddLog(msg.ToString());
                throw;
            }
        }
        #endregion


...
Рейтинг: 0 / 0
Com port работа с несколькими
    #38666157
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roer

Очень смутно у вас написано, и без понимания.
Таймер вот разве можно так использовать - создавать новый в цикле, присваивать обработчик, запускать и выходить из цикла.....

Какую вообще пробему вы решаете таким образом?

Что же касается всей задачи - то чтобы предложить что-то оптимальное надо знать больше про ваши требования.

Например - эта апликация все время запущена, или должна подняться - сделать работу -упасть?

А между обработками портов база данных может измениться?
(Мне кажется что врядли - но всякое бывает...)

И так далее.

Если вы учитесь - попробуйте подумать об обьекте, который может выполнить всю работу с любым ком портом сам. Если у вас будет такой обьект, то вы сможете организовать коллекцию таких обьектов, а не писать замусоренные подключениями-отключениями циклы....
...
Рейтинг: 0 / 0
Com port работа с несколькими
    #38666212
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roer,
соглашусь с коллекцией наблюдателей, принцип хоть отсюда http://stackoverflow.com/questions/15124132/serial-port-polling-and-data-handling, над таймером тоже посмеялся ))
...
Рейтинг: 0 / 0
Com port работа с несколькими
    #38666217
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дело такое - сервис получает список компортов, получает что он должен отправить на эти компорты. затем что получил то пишет в базу. если с обработкой опс серверов проблем не возникло (там в цикле довольно просто оббежать все порты), то тут необходимо создавать это событие eventhandler (вот тут то и главная загвоздка) к одному то подцепиться проблем не возникает, необходимо в цикле перебирать все полученные компорты\что посылать
...
Рейтинг: 0 / 0
Com port работа с несколькими
    #38666220
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
таймер нужен чтобы постоянно опрашивать
...
Рейтинг: 0 / 0
Com port работа с несколькими
    #38666228
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roer,
наблюдатель ( как единица) должен быть самодостаточным, он должен сам знать что ему делать в каких ситуациях
куда писать и что отвечать, это все естественно присваивается ему ( учим его как поступать) при инициализации
...
Рейтинг: 0 / 0
Com port работа с несколькими
    #38666234
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну я ему даю значение ком порта, что посылать пишу, таймер устанавливаю. но не известно будет ли один ком порт, а сколько их будет не знаю
...
Рейтинг: 0 / 0
Com port работа с несколькими
    #38666244
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roer,
тут и напрашивается ответ, если наблюдатели изолированы между собой ( ну может в екшене где пересекаются с аккумулятором)
на каждый порт вешаем наблюдателя: 100 портов 100 наблюдателей
...
Рейтинг: 0 / 0
Com port работа с несколькими
    #38666271
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это крайне плохое решение мне кажется. есть 1 сервис - он может опрашивать все опс сервера что к нему подключены, все железяки по ip, необходимо еще и все com порты просматривать. т.е. как нибудь в цикле перебирать к какому порту цепляться и что посылать
...
Рейтинг: 0 / 0
Com port работа с несколькими
    #38666290
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roerэто крайне плохое решение мне кажется.
Обоснуйте.
У вас будет коллекция обьектов, которые могут быть подключены к своим портам, могут быть не подключены - это все пишется.

Во внешнем коде будет только перебор этих обьектов (любого их количества).
Что вы боитесь растратить? Память?
...
Рейтинг: 0 / 0
Com port работа с несколькими
    #38666310
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вы предлагаете мне создать порядка 20-30 объектов для компортов, при реальном существовании 6-7 и не факт что не будет компорта от какого нить индусского производителя за номером 123
...
Рейтинг: 0 / 0
Com port работа с несколькими
    #38666314
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D129,
авторвы предлагаете мне создать порядка 20-30 объектов для компортов, при реальном существовании 6-7
гыггы,
Данатос, тут бесполезно спорить, то о чем мы говорим по существу не несет никакого предмета обучения или получения навыков
для ТА, только время, пустая епля в пустую и попытки прикрутит тесты к расползающемуся киселю, вставят в мозг принятия правильных решений.
...
Рейтинг: 0 / 0
Com port работа с несколькими
    #38666317
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мне нужно то поменять в трех местах переменную чтобы другой ком порт указать

Код: c#
1.
2.
3.
4.
5.
6.
7.
send = dt3.Rows[х][3].ToString() + "\r";   \\что посылать
                        com = "COM" + dt3.Rows[х][7];      \\номер компорта
                        port = new SerialPort(com, 9600, System.IO.Ports.Parity.None, 8, System.IO.Ports.StopBits.One);

****
     String Mystr = ("INSERT INTO " + list[5] + "(\"F_TagName_ID\",\"F_Value\",\"F_Date\")  VALUES (" + dt3.Rows[х][0].ToString() + ",\'" + indata + "\',\'" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "\'   )");  \\какое имя указывать
           
...
Рейтинг: 0 / 0
Com port работа с несколькими
    #38666320
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
о чем вы говорите? вы действительно для каждого компорта создаете своего слушателя? а если они (считай все) - виртуальные. и число их может впоследствии расти - и COM200 не будет являться чем то сверхъестественным? как такое написать? ну или может как нибудь динамически слушателей добавлять что бы не врукопашную все забивать7
...
Рейтинг: 0 / 0
Com port работа с несколькими
    #38666327
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roer и не факт что не будет компорта от какого нить индусского производителя за номером 123

Важно другое - когда появится компорт за номером 123?
На каком этапе жизни аппликации?

Вариантов много.
Например - на этапе кодирования. Тогда, чисто технически, можно и захардкодить все. :-)

На этапе, когда сервис запущен? (А компорты разве подключаются динамически? может я чего и не знаю... )
При запуске сервиса?

В любом случае - количество обьектов будет зависеть только от конфигурации, а она, как я понимаю, читается из базы данных? Тогда почему вы считаете что обьектов может "больше чем нужно" ?
...
Рейтинг: 0 / 0
Com port работа с несколькими
    #38666335
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи тут бесполезно спорить...
:-)
Ну а вдруг. Я конечно, мало спрашивал на форумах, больше читал. И тоже иногда у меня возникала мысль "О чем вы говорите!" ....
Ну поломаюсь чуть, для приличия, да и соглашаюсь...
:-)
...
Рейтинг: 0 / 0
Com port работа с несколькими
    #38666337
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да, сервис получает данные из базы, динамически. сервис один раз написан - и все, его не трогают, только перезапускают чтобы новые данные подхватил. необходима максимальная гибкость. соответственно, нагрузка будет большая и чем меньше размер программы тем лучше. т.е в прога в цикле должна уметь читать данные с портов. и да. порты могут меняться, может меняться оборудование и могут меняться цифры. вполне реально ситуация com1, com15 и com 45 на одном серваке и com2, com3, com 4 на другом, причем данные должны распарсиватьяс по разному в зависимости от полученных данных с сервера
...
Рейтинг: 0 / 0
Com port работа с несколькими
    #38666338
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roerо чем вы говорите? вы действительно для каждого компорта создаете своего слушателя?
Боюсь вас удивить - но современная мода программирования создает "своего слушателя" практически для каждой кнопки на окне.
В WPF например, паттерн Command....

Я даже начинаю догадываться, что именно вы называете "динамическим" и почему вы считате предложенную вам коллекцию "ручным" способом....

:-/


:-)
...
Рейтинг: 0 / 0
Com port работа с несколькими
    #38666339
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может хоть подскажете где эмулятор ком порта взять?
...
Рейтинг: 0 / 0
Com port работа с несколькими
    #38666341
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может я чего то не понимаю. но вот пример в начале статьи - это один слушатель по вашему? по моему это один слушатель
...
Рейтинг: 0 / 0
Com port работа с несколькими
    #38666344
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roer,
Ну а мы вам о чем?
Расскажите, что вы подумали, раз несогласны.
А мы вам с позиции своего опыта (ну какой уж есть)
развеем ваши опасения по поводу производительности и "размера программы".
:-)
...
Рейтинг: 0 / 0
Com port работа с несколькими
    #38666349
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roerможет я чего то не понимаю. но вот пример в начале статьи - это один слушатель по вашему? по моему это один слушатель
да, это один слушатель.
Он коряво получает настройки, неоптимально инициализируется (каждый раз создается обьект, который вовсе не протух с предыдущего использования), и рискованно вызывается.

Всех достоинств - что он один.
...
Рейтинг: 0 / 0
Com port работа с несколькими
    #38666373
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так вот читаю про эмулятор : Возможность создания до 255 виртуальных COM-портов;
т.е. вы мне предлагаете создать 255 слушателей на каждый компорт? даже если оптимизировать мое "творение", то чето много быдлокода получается
...
Рейтинг: 0 / 0
Com port работа с несколькими
    #38666478
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roerтак вот читаю про эмулятор : Возможность создания до 255 виртуальных COM-портов;
т.е. вы мне предлагаете создать 255 слушателей на каждый компорт? даже если оптимизировать мое "творение", то чето много быдлокода получается
А я догадался, что вы не знаете, как использовать такую конструкцию, как класс...
:-)

Я вам сейчас солюшен накидаю - а вы уже доводите до ума.
...
Рейтинг: 0 / 0
Com port работа с несколькими
    #38666576
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO.Ports;
using System.Windows.Forms;
using System.Data;

namespace COMSpectators
{
	class Program
	{

		static Timer mainTimer;
		
		static DataSet ds3;

		static DataTable dt3;
		
		static List<OneCOMSpectator> allListeners;

		static void Main(string[] args)
		{
			InitAll();

			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\", \"ID_RealHardWare\",   \"F_ParseFunction\",   \"F_ComQuery\",   \"F_AnswerLenght\",   \"F_AnswerKey\",   \"F_AnswerKeyPosition\",   \"F_ComPort\",   \"F_ComPortIPAdress\",   \"F_ComPortBaudRate\",   \"F_ComPortParity\",   \"F_ComPortDataBits\",   \"F_ComPortStopBit\",   \"F_ComPortFlowControl\",   \"F_ComPortTimeOut\" ,  \"ID_HardWareTag\",   \"F_OPCServerName\",   \"F_IDOPCTag\", \"F_TagReadTime\",   \"Transmit\",   \"F_RealHardWare_ID\" FROM  \"SC_Tag\".\"T_TagName\" as tn,\"SC_Tag\".\"T_HardWareTag\" as hw , \"SC_Tag\".\"T_RealHardWare\" as rh where  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\' ";
			//   string sql = "  SELECT \"F_name\", \"F_OPCServerName\", \"F_IDOPCTag\", \"F_TagReadTime\",  \"ID_TagName\"   FROM \"SC_Tag\".\"T_TagName\" as tn, \"SC_Tag\".\"T_HardWareTag\" as hw  where tn.\"F_HardWare_ID\" = hw.\"ID_HardWareTag\"    and \"F_ServerName\"  =\'" + Environment.MachineName + "\' ";

			NpgsqlDataAdapter da3 = new NpgsqlDataAdapter(sql, conn);

			ds3.Reset();
			da3.Fill(ds3);
			dt3 = ds3.Tables[0];
			dataGridView3.DataSource = dt3;


			int mainInterval = 1000;//Convert.ToInt32(dt3.Rows[0][14]);
			mainTimer = new Timer();
			mainTimer.Interval = mainInterval;

			mainTimer.Enabled = true;
			mainTimer.Tick+=new EventHandler(mainTimer_Tick);


		}

		static void  mainTimer_Tick(object sender, EventArgs e)
		{
 			foreach(OneCOMSpectator comListener in allListeners)
			{
				comListener.TransferData();
			}
		}



		private static void InitAll()
		{

			allListeners = new List<OneCOMSpectator>();

			for(int xx = 0; xx < ds3.Tables[0].Rows.Count; ++xx)
			{
				string com = "COM" + dt3.Rows[xx][7];
				string send = dt3.Rows[xx][3].ToString() + "\r";


				allListeners.Add(new OneCOMSpectator(com, 9600, send));
			}


		}
	}


	class OneCOMSpectator
	{
		SerialPort _COM;
		string DataToSend;

		internal OneCOMSpectator(string portNumber, int bodRate, string dataTosend)
		{
			DataToSend = dataTosend;
			_COM = new SerialPort(portNumber, bodRate, System.IO.Ports.Parity.None, 8, System.IO.Ports.StopBits.One);
			_COM.DataReceived += new SerialDataReceivedEventHandler(_COM_DataReceived);
		}

		void _COM_DataReceived(object sender, SerialDataReceivedEventArgs e)
		{
			// Пришли данные
		}


		internal void TransferData()
		{
			if(_COM.IsOpen)
			{
				// Если порт открыт, значит какой-то косяк, девайс не ответил, здесь обрабатываем

				// Закрываем
				_COM.Close();
			}

			// Открываем
			_COM.Open();

			_COM.Write(DataToSend);
			
		}

	
	}

}



Солюшен не обязательно посылать, у вас же сервис, а не винформы ...

Я оставляю на вашей совести доступ в базу - тоже не все айс, но это можно потом.
и получении данных - если вы там пишете в базу, то надо открывать новое соединение - евент ведь вызывается в другом потоке.
Если диалоговое окно - ни в коем случае, тем более сервису не положено окнами кидаться.
...
Рейтинг: 0 / 0
Com port работа с несколькими
    #38667063
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо огромное попробую разобраться
...
Рейтинг: 0 / 0
Com port работа с несколькими
    #38667069
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати вот оригинальный код проги
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
 using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
//-----
using System.IO.Ports;
using System.IO;


namespace comSobitie
{
    public partial class Form1 : Form
    {
        
        // Таймер
        Timer timer = new Timer();
        // Порт
        SerialPort port = new SerialPort("COM2", 9600, System.IO.Ports.Parity.None, 8, System.IO.Ports.StopBits.One);
        string valu = "";
        String indata = "";
        public Form1()
        {
            InitializeComponent();
           System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;  //ОЧЕНЬ СПОРНОЕ РЕШЕНИЕ !!!!!!!!!!
            // Подписались на приход данных
            port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);

            // Задаем интервал таймеру
            timer.Interval = 10000;
            // Подписываемся на тики таймера
            timer.Tick += new EventHandler(timer1_Tick);
            // Стартуем таймер
            timer.Start(); 
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            // Открываем порт
            if (port.IsOpen)
            {
                // Если порт открыт, значит какой-то косяк, девайс не ответил, здесь обрабатываем

                // Закрываем
                port.Close();
            }

            // Открываем
            port.Open();

            // Чето посылаем
            port.Write("#10\r");
        }
        int i = 0;
        // Пришли данные
        void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
                 System.Threading.Thread.Sleep(100);
                // Получаем пришедшие данные
                indata = port.ReadExisting();
                
                // Чето с ними делаем

                textBox1.Text = " SELECT  \"ID_TagName\"" + indata + " ;";
      
                // Закрываем порт
                if (port.IsOpen) port.Close();                      
           
        }

    }
}


...
Рейтинг: 0 / 0
Com port работа с несколькими
    #38667211
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нашел еще такое ---
Вот готовая оболочка, которую я когда-то использовал для работы с СОМ-портами (если нужно, то есть классы, выкусывающие пакеты по признаку начала и конца, а также по заданному тайм-ауту):

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
    /// <summary>
    /// Класс работы с последовательным портом
    /// </summary>
    public class SerialPort : IDisposable
    {
        //--------------------------------------------------------------------------
        //Construction, Destruction
        //--------------------------------------------------------------------------
        #region Construction, Destruction
        /// <summary>
        /// Оболочка для работы с СОМ-портом
        /// </summary>
        /// <param name="comNum">Номер СОМ-порта</param>
        /// <param name="baudRate">Скорость</param>
        public SerialPort(byte comNum, int baudRate)
        {
            this.comNum = comNum;
            serialPort = new System.IO.Ports.SerialPort("COM" + comNum.ToString(), baudRate);
            serialPort.Open();
            thread = new System.Threading.Thread(ThreadFn);
            thread.Start();
        }
        
        /// <summary>
        /// Очистка ресурсов
        /// </summary>
        public void Dispose()
        {
            DisposeImpl(true);
        }
        
        /// <summary>
        /// Finalizer
        /// </summary>
        ~SerialPort()
        {
            DisposeImpl(false);
        }

        private void DisposeImpl(bool manualDispose)
        {
            if (manualDispose)
            {
                if (thread != null)
                    thread.Abort();
                if (serialPort != null)
                    serialPort.Dispose();
            }
        }
        #endregion Construction, Destruction

        //--------------------------------------------------------------------------
        //Public Interface
        //--------------------------------------------------------------------------
        #region Public Interface
        /// <summary>
        /// Отправить данные
        /// </summary>
        /// <param name="data">Массив данных</param>
        /// <exception cref="Exception">Генерируется, если при работе с последовательным портом
        /// возникнет исключение</exception>
        public void SendData(Byte[] data)
        {
            serialPort.Write(data, 0, data.Length);
        }
        
        /// <summary>
        /// Текущий номер СОМ-порта
        /// </summary>
        public Byte ComNum
        {
            get { return comNum; }
            set
            {
                if (comNum != value)
                {
                    comNum = value;
                    serialPort.Close();
                    serialPort.PortName = "COM" + value.ToString();
                }
            }
        }

        /// <summary>
        /// Скорость передачи данных
        /// </summary>
        public int BaudRate
        {
            get { return serialPort.BaudRate; }
            set { serialPort.BaudRate = value; }
        }
        /// <summary>
        /// Состояние линии Dtr
        /// </summary>
        public bool DtrEnable
        {
            get { return serialPort.DtrEnable; }
            set { serialPort.DtrEnable = value; }
        }
        /// <summary>
        /// Состояние линии Rts
        /// </summary>
        public bool RtsEnable
        {
            get { return serialPort.RtsEnable; }
            set { serialPort.RtsEnable = value; }
        }

        /// <summary>
        /// Делегат приема байта
        /// </summary>
        /// <param name="data">Принятый байт данных</param>
        public delegate void OnByteReceived(Byte data);

        /// <summary>
        /// Событие приема байт
        /// </summary>
        public event OnByteReceived ByteReceived;
        #endregion Public Interface

        //--------------------------------------------------------------------------
        //Private Member Functions
        //--------------------------------------------------------------------------
        #region Private Member Functions
        //Обработка принятого байта
        private void OnReceiveByte(Byte data)
        {
            //Если на событие приема байт кто-то подписан, то отправляю ему байт
            if (ByteReceived != null)
                ByteReceived(data);
        }
        //Функция чтения данных в новом потоке
        private void ThreadFn(object obj)
        {
            //создаю входной буффер. Сюда будут писаться данные из последовательного порта
            Byte[] inputBuffer = new Byte[inputBufferSize];
            while (true)
            {

                try
                {
                    //получаю количество доступных байт
                    int availibleBytes = serialPort.BytesToRead;
                    if (availibleBytes > 0)
                    {
                        int bytesToRead = availibleBytes < inputBufferSize ? availibleBytes : inputBufferSize;
                        int readedBytes = serialPort.Read(inputBuffer, 0, bytesToRead);
                        for (int i = 0; i < readedBytes; i++)
                            OnReceiveByte(inputBuffer[i]);
                    }
                    System.Threading.Thread.Sleep(1);
                }
                catch (System.Threading.ThreadAbortException)
                {
                    break;
                }
                catch (Exception e)
                {
                    System.Diagnostics.Debug.Assert(false, e.Message);
                }
            }
        }
        #endregion Private Member Functions

        //--------------------------------------------------------------------------
        //Private Data Members
        //--------------------------------------------------------------------------
        #region Private Data Members
        /// <summary>
        /// Номер СОМ-порта
        /// </summary>
        private Byte comNum;
        /// <summary>
        /// Последовательный порт
        /// </summary>
        private System.IO.Ports.SerialPort serialPort;
        /// <summary>
        /// Поток. Нужен, т.к. данные читаются в новом потоке
        /// </summary>
        private System.Threading.Thread thread;
        /// <summary>
        /// Максимальный размер входного буффер
        /// </summary>
        private const int inputBufferSize = 1024;

        #endregion Private Data Members
    }//class RS232

...
Рейтинг: 0 / 0
Com port работа с несколькими
    #38670081
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D129 или кто-нибудь еще. А какая прелесть все static указывать?
...
Рейтинг: 0 / 0
Com port работа с несколькими
    #38670087
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roerD129 или кто-нибудь еще. А какая прелесть все static указывать?

старые привычки,ИМХО
...
Рейтинг: 0 / 0
Com port работа с несколькими
    #38670096
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roerD129 или кто-нибудь еще. А какая прелесть все static указывать?

Хороший вопрос.
В вашем случае функция main - статическая. И находится в классе Program.
Она может использовать напрямую только статические переменные.
...
Рейтинг: 0 / 0
Com port работа с несколькими
    #38670105
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилdes1roerD129 или кто-нибудь еще. А какая прелесть все static указывать?

старые привычки,ИМХО
Нет, просто не хотел усложнять.

По идее, надо создать еще один класс, который менеджер над OneCOMSpectator,
А в функции main - создавать экземпляр этого менеджера и тогда все можно делать динамическим.

Тут мы уже выходим на уровень, когда у нас может быть коллекция менеджеров, которые (например) отличаются друг от друга коллекциями портов и интевалами опроса.
:-)
...
Рейтинг: 0 / 0
Com port работа с несколькими
    #38670341
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D129, сегодня со свежей головой посмотрел, сделал на основе вашего класса. вроде классно получилось. имхо, статик тут не очень нужен как я понял. еще пришлось добавить имя тэга, чтобы в базу заносить
...
Рейтинг: 0 / 0
Com port работа с несколькими
    #38738332
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в общем и в целом необходимо тему воскресить
что имел до этого
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
354.
355.
356.
357.
358.
359.
360.
361.
362.
363.
364.
365.
366.
367.
368.
369.
370.
371.
372.
373.
374.
375.
376.
377.
378.
379.
380.
381.
382.
383.
384.
385.
386.
387.
388.
389.
390.
391.
392.
393.
394.
395.
396.
397.
398.
399.
400.
401.
402.
403.
404.
405.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.ServiceProcess;
using System.Text;
///----
using System.Xml; //xml
using Npgsql;  //pg
using System.Threading;
using System.IO.Ports; //com
using NLog;

namespace ServiceDOF4
{
    public partial class Service1 : ServiceBase
    {
        XmlDocument xml = new XmlDocument();    //xml
        static List<string> list = new List<string>(); //xml
        static private DataSet ds = new DataSet(); //pg com
        static private DataTable dt = new DataTable(); //pg com
        private System.Timers.Timer timer2;
        static String Mystr = null; //pg_query
        static int min = 5000; //time
        private static Logger logger = LogManager.GetCurrentClassLogger(); //log
        static List<MyComReader> allListeners; //list_of_com

        public Service1()
        {
            InitializeComponent();
            XMLReader();
        }

        #region Xml
        public void XMLReader()
        {
            try
            {
                xml.Load("c:\\DATA\\server_info_uni.xml");
                foreach (XmlNode n in xml.SelectNodes("/server_info"))
                {
                    list = new List<string>();
                    list.Add(n.SelectSingleNode("server").InnerText);
                    list.Add(n.SelectSingleNode("port").InnerText);
                    list.Add(n.SelectSingleNode("user_id").InnerText);
                    list.Add(n.SelectSingleNode("password").InnerText);
                    list.Add(n.SelectSingleNode("database").InnerText);
                    list.Add(n.SelectSingleNode("table").InnerText);        //5
                    list.Add(n.SelectSingleNode("tcpenable").InnerText);    //6
                    list.Add(n.SelectSingleNode("opcenable").InnerText);    //7
                    list.Add(n.SelectSingleNode("comenable").InnerText);    //8
                    list.Add(n.SelectSingleNode("value").InnerText);        //9
                }
              
            }
            catch (Exception msg)
            {               
                logger.Trace(msg);
                throw;
            }
        }
        #endregion

        
        #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

        #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
        protected override void OnStart(string[] args)
        {
            try
            {
                if (list[8] == "1")
                {
                    SelectCom();
                }

            }
            catch (Exception msg)
            {             
                logger.Trace(msg);
                return;
            }
        }

        protected override void OnStop()
        {
            try
            {
                if (list[8] == "1")
                {                   
                    foreach (MyComReader comListener in allListeners)
                    {
                        if (comListener.ThreadState())
                            comListener.ThreadStop();
                    }
                    this.timer2.Stop();
                    
                }
            }
            catch (Exception msg)
            {
                logger.Trace(msg);
                return;
            }
        }
    }
}



в общем работает с несколькими ком портами. но появилась прелесть в виде ОДНОГО ком порта, на который надо слать данные
...
Рейтинг: 0 / 0
Com port работа с несколькими
    #38738337
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roerв общем работает с несколькими ком портами. но появилась прелесть в виде ОДНОГО ком порта, на который надо слать данные

Задача ОДНОГО компорта - это частный случай задачи НЕСКОЛЬКИХ портов. Задача решена
...
Рейтинг: 0 / 0
Com port работа с несколькими
    #38738338
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мне необходимо - получить все данные о компорте из бд, ну это самое легкое. затем запустить поток, отправить конкретное значение, получить данные, прибить(приостановить?) поток и запустить поток для следующего порта. и так по интервалу.
то есть опросили порт, отключились, опросили следующий и так до восьми.
30 секунд прошло - начали снова.
прога работает, но как то глючно, периодически порт отваливается.
подскажите хоть как сделать работу с потоками и классом, работу с ком портом вроде понимаю
...
Рейтинг: 0 / 0
Com port работа с несколькими
    #38738346
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот не хочет она корректно закрывать и открывать порт. через короткое время выскакивает
09/05/2014 12:16:26|Debug|Execute() System.UnauthorizedAccessException: Access to the port 'COM17' is denied.
at System.IO.Ports.InternalResources.WinIOError(Int32 errorCode, String str)
at System.IO.Ports.SerialStream..ctor(String portName, Int32 baudRate, Parity parity, Int32 dataBits, StopBits stopBits, Int32 readTimeout, Int32 writeTimeout, Handshake handshake, Boolean dtrEnable, Boolean rtsEnable, Boolean discardNull, Byte parityReplace)
at System.IO.Ports.SerialPort.Open()
at Srvc_MOF_Com.Service1.MyComReader.Execute() in E:\proj\Srvc_MOF_Com\Srvc_MOF_Com\Service1.cs:line 278
...
Рейтинг: 0 / 0
Com port работа с несколькими
    #38738349
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может как пошагово решить проблему? ну то есть сделать 146% правильный опрос 1 ком порта, затем создать решение с потоком, переключающимся через 1 секунду на следущий. затем объеденить полученнное - и вуаля, 8 потоков, не знающих друг о друге и работающих попеременно?
как сделать такую магию? вроде видел примеры с потоками да сейчас найти не могу
...
Рейтинг: 0 / 0
Com port работа с несколькими
    #38738351
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лично я в процессе работы программы не закрываю ком-порты. Открыв один раз, так и держу. Проблем не испытываю
...
Рейтинг: 0 / 0
Com port работа с несколькими
    #38738355
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и еще я запутался с потоками c wh.set, wh.waitone
...
Рейтинг: 0 / 0
Com port работа с несколькими
    #38738360
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roerи еще я запутался с потоками c wh.set, wh.waitone

Что не ясно? В двух словах поток висит на waitone, пока где-то не сделаешь wh.set.

Я бы посоветовал отойти от этого подхода и сделать через события. А то это одноногая многопоточность получается.
...
Рейтинг: 0 / 0
Com port работа с несколькими
    #38738370
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а можно пример?
...
Рейтинг: 0 / 0
Com port работа с несколькими
    #38738373
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так а подробнее вайтон - ждет события, сет- это значит что? типа переключись на другой поток? а про события? это как сп_редекзистинг ? они?
...
Рейтинг: 0 / 0
43 сообщений из 43, показаны все 2 страниц
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Com port работа с несколькими
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]