powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / работа с несколькими COM портами
7 сообщений из 7, страница 1 из 1
работа с несколькими COM портами
    #38669965
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Товарищи программисты, необходимо сделать программу опроса нескольких com портов. Опрос одного сделать оказалось просто, а вот нескольких - задача конкретно усложнилась. Сразу скажу - количество портов сразу не известно. Данные получаю с базу. т.е. число может меняться динамически.
вот код для одного ком порта
Код: 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 портами
    #38669968
Фотография 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 портами
    #38670000
Фотография fortibransa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это не красота, это тупая хрень какая-то.
Зачем в потоке опрашивать есть-ли данные, когда у порта есть событие прихода данных.
И опять-же грубая остановка потока, гораздо проще заместо while(true), сделать типа while(varTh) и просто для остановки varTh=false.
...
Рейтинг: 0 / 0
работа с несколькими COM портами
    #38670011
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
код не мой, я даже это запустить не смог. думал что опросить несколько ком портов просто а вот нифига не получается
...
Рейтинг: 0 / 0
работа с несколькими COM портами
    #38670028
Фотография fortibransa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну как-то поконкретнее давай уж.
За тебя что-то писать не собираемся.
...
Рейтинг: 0 / 0
работа с несколькими COM портами
    #38670052
gr_vl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roer,


Смотри работу в потоках (Thread)
каждый поток (нить) опрашивает свое устройство,
сколько нужно устройств столько потоков и запускай, каждому потоку передавай свое устройство для опроса (ну и что там тебе еще нужно для работы).
...
Рейтинг: 0 / 0
работа с несколькими COM портами
    #38670061
Фотография 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.
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
7 сообщений из 7, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / работа с несколькими COM портами
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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