powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / потоки в C#
25 сообщений из 76, страница 1 из 4
потоки в C#
    #38674887
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дело такое - опрашиваю ком порты. есть функция и класс, отвечающие за разные методы.
приходится ставить thread.sleep() чтобы получить значение с ком порта, потому что сразу они не приходят.
так вот - все это дело крутится в таймере.
пытаюсь выключить таймер - он мне ругается.
как остановить thread.sleep по клику?
...
Рейтинг: 0 / 0
потоки в C#
    #38674892
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roerдело такое - опрашиваю ком порты. есть функция и класс, отвечающие за разные методы.
приходится ставить thread.sleep() чтобы получить значение с ком порта, потому что сразу они не приходят.
так вот - все это дело крутится в таймере.
пытаюсь выключить таймер - он мне ругается.
как остановить thread.sleep по клику?Зачем таймер? У компорта есть события.
...
Рейтинг: 0 / 0
потоки в C#
    #38674894
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и ? мне нужно поинтервально опрашивать его
...
Рейтинг: 0 / 0
потоки в C#
    #38674895
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может можно узнать состояние потока и запустить его не ожидая слип
...
Рейтинг: 0 / 0
потоки в C#
    #38674903
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roerи ? мне нужно поинтервально опрашивать егоОбычно поинтервально делают запрос+ответ.

А если девайс постоянно шлёт данные в порт, без запроса, то лучше принимать данные по событию.

авторприходится ставить thread.sleep() чтобы получить значение с ком порта, потому что сразу они не приходят.Этот момент проясни, обычно это решается через read timeout в порте.
...
Рейтинг: 0 / 0
потоки в C#
    #38674905
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
readtimeout не помогает. пробовал
_COM.ReadTimeout = timeout;
_COM.WriteTimeout = timeout;
да идет запрос-ответ. в общем, если не привязываться к технологии возможно прибить слип? хотя, может я таймаут неправильно выставил? но вот сколько не менял - разницы ровным счетом никакой
...
Рейтинг: 0 / 0
потоки в C#
    #38674911
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roer,

Тайм аут нужно задавать перед открытием порта. В милисекундах
...
Рейтинг: 0 / 0
потоки в C#
    #38674914
Фотография 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.
namespace ServiceUniOPc
{
    public partial class Service1 : ServiceBase
    {
        public Service1()
        {
            InitializeComponent();
           
        }


        #region tcpconnect
        private void SelectTcp()  //com port
        {
           this.timer1.Start();           
        }


        private void timer1_Elapsed(object sender, EventArgs e)
        {
		for (int i = 0; i < ds.Tables[0].Rows.Count; i++)               
                        Connect(dt.Rows[i][1].ToString(), dt.Rows[i][2].ToString() + "\r", Convert.ToInt32(dt.Rows[i][3]), i);
           
        }

        void Connect(String server, String message, Int32 port, Int32 id)
        {
            try
            {
                // Create a TcpClient.
                // Note, for this client to work you need to have a TcpServer 
                // connected to the same address as specified by the server, port
                // combination.
                TcpClient client = new TcpClient(server, port);

                // Translate the passed message into ASCII and store it as a Byte array.
                Byte[] data = Encoding.UTF8.GetBytes(message);
                // Get a client stream for reading and writing.
                

                NetworkStream stream = client.GetStream();

                // Send the message to the connected TcpServer. 
                stream.Write(data, 0, data.Length);

            

                // Receive the TcpServer.response.

                // Buffer to store the response bytes.
                data = new Byte[256];

                Thread.Sleep(300);
                

                // String to store the response ASCII representation.              

                // Read the first batch of the TcpServer response bytes.
                Int32 bytes = stream.Read(data, 0, data.Length);
                responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes);
  
                // Close everything.
                stream.Close();
                client.Close();

            }
			
        }        
        #endregion 


        #region comport
        private void SelectCom()  //com port
        {
                        InitAll();        
        }
      


        private void InitAll()
        {
               allListeners = new List<OneCOMSpectator>();

                for (int xx = 0; xx < ds3.Tables[0].Rows.Count; ++xx)
                {
                    string com = "COM" + dt3.Rows[xx][1];
                    string send = dt3.Rows[xx][3].ToString() + "\r";
                    string idcom = dt3.Rows[xx][0].ToString();
                    int BaudRate = Convert.ToInt32(dt3.Rows[xx][2]);
                    string parity = dt3.Rows[xx][10].ToString();
                    int databit = Convert.ToInt32(dt3.Rows[xx][11]);
                    double stopbit = Convert.ToDouble(dt3.Rows[xx][12]);
                    string flowcontrol = dt3.Rows[xx][13].ToString();
                    int timeout = Convert.ToInt32(dt3.Rows[xx][14]);
                    string parseFunc = dt3.Rows[xx][4].ToString();
                    allListeners.Add(new OneCOMSpectator(com, BaudRate, send, idcom, parity, databit, stopbit, flowcontrol, timeout, parseFunc));
                }
                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.timer3 = new System.Timers.Timer();
                    this.timer3.Enabled = true;
                    this.timer3.Interval = min;
                    this.timer3.Elapsed += new System.Timers.ElapsedEventHandler(this.timer3_Elapsed);
                    this.timer3.AutoReset = true;
                    this.timer3.Start();
         
          
        }

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

        }

        class OneCOMSpectator
        {
             
            SerialPort _COM;
            string DataToSend;
            string IdCom;
            string ParseGlob = "";

            internal OneCOMSpectator(string portNumber, int bodRate, string dataTosend, string idcom, string parity, int databit, double stopbit, string flowcontrol, int timeout, string parse)
            {
                IdCom = idcom;
                DataToSend = dataTosend;
                _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 += new SerialDataReceivedEventHandler(_COM_DataReceived);

            }

            void _COM_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                    Thread.Sleep(100);
                    // Пришли данные
                    String indata = _COM.ReadExisting();
                    indata = indata.Substring(0, indata.Length - 1);
                    String Mystr = "";
                    // Чето с ними делаем  

            }


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

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

                    // Открываем
                    _COM.Open();
                    _COM.Write(DataToSend);
                }
                catch 
                {
                    
                    return;
                }
            }
        }    
        #endregion

        #region start
        protected override void OnStart(string[] args)
        {

                      SelectTcp(); 
              
                    SelectCom();
             
                
           
        }
        #endregion

        #region stop
        protected override void OnStop()
        {
                if (this.timer1.Enabled) this.timer1.Stop();
               
                if (this.timer3.Enabled)  this.timer3.Stop();
            
        }
        #endregion

    }
}




...
Рейтинг: 0 / 0
потоки в C#
    #38674916
Фотография 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.
           IdCom = idcom;
                DataToSend = dataTosend;
                _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 += new SerialDataReceivedEventHandler(_COM_DataReceived);
//////////
    if (_COM.IsOpen)
                    {
                        // Если порт открыт, значит какой-то косяк, девайс не ответил, здесь обрабатываем

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

                    // Открываем
                    _COM.Open();
                    _COM.Write(DataToSend);
                }
...
Рейтинг: 0 / 0
потоки в C#
    #38674946
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не вижу, где у тебя чтение порта (не по событию). Назначение тайм аута - выбить эксепшн, если ты обратился к методу read, а он в течении времени не выдал данные
...
Рейтинг: 0 / 0
потоки в C#
    #38674950
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Read existing под это дело не пдходит тк нечего читать - и тайм аут не срабатывает
...
Рейтинг: 0 / 0
потоки в C#
    #38674956
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а что подходит?
...
Рейтинг: 0 / 0
потоки в C#
    #38674960
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
потоки в C#
    #38674991
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нет. также дергает первые несколько символов.
попробовал
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
      byte[] buf1 = new byte[16];
                

                    // Пришли данные                 
                   _COM.Read(buf1,0,16);
                 
                    // Чето с ними делаем  
                    string tmp = System.Text.Encoding.ASCII.GetString(buf1);
                    MessageBox.Show(tmp);
...
Рейтинг: 0 / 0
потоки в C#
    #38674992
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может есть способ проверить есть ли еще данные которые нужно принять
...
Рейтинг: 0 / 0
потоки в C#
    #38675025
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ты не знаешь, сколько данных должно прийти в ответ на запрос?
...
Рейтинг: 0 / 0
потоки в C#
    #38675029
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
знаю
...
Рейтинг: 0 / 0
потоки в C#
    #38675033
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roerнет. также дергает первые несколько символов.
попробовал
Код: c#
1.
2.
      byte[] buf1 = new byte[16];            
                   _COM.Read(buf1,0,16);



ну так ты тут считываешь 16 байт. Если придет меньше - вывалится exeption после таймаута. Если больше - нужно считывать дальше
...
Рейтинг: 0 / 0
потоки в C#
    #38675035
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как?
...
Рейтинг: 0 / 0
потоки в C#
    #38675042
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты ж сказал, что знаешь, сколько должно прийти байт. С чего их должно быть больше?

Если все-таки не знаешь, то лучше подход с событием применять.
...
Рейтинг: 0 / 0
потоки в C#
    #38675051
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну так че мне цикл делать? как понять то сколько байт пришло?
...
Рейтинг: 0 / 0
потоки в C#
    #38675054
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roer,

попробуй обратиться к свойству _port.BytesToRead, может поможет
...
Рейтинг: 0 / 0
потоки в C#
    #38675096
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чет не вникну
Код: c#
1.
2.
3.
4.
5.
6.
   while (_COM.BytesToRead > 0)
                   {
                       _COM.Read(buf1, 0, 256);
                       string tmp = System.Text.Encoding.ASCII.GetString(buf1);
                       tmp_buf += tmp;
                   }


приходит сначала полчисла и потом полчисла
...
Рейтинг: 0 / 0
потоки в C#
    #38675123
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по сути, если хранить все что пришло на тике-1 и записывать это на тике , то это и будет число. оно явно должно успеть придти
...
Рейтинг: 0 / 0
потоки в C#
    #38675229
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roerну так че мне цикл делать? как понять то сколько байт пришло?Это должно решаться на уровне протокола передачи данных. В протоколах обычно или сначала передаётся размер пакета, или известен символ завершения пакета.
...
Рейтинг: 0 / 0
25 сообщений из 76, страница 1 из 4
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / потоки в C#
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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