powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Работа с COM портом
10 сообщений из 35, страница 2 из 2
Работа с COM портом
    #38653212
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EDUARD SAPOTSKIИ чо? Дал запрос, подписался на приход, запустил таймер, нет ответа - отписался от прихода, делаем запрос другому девайсу.

Не, спасибо
...
Рейтинг: 0 / 0
Работа с COM портом
    #38653291
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
с событиями муть какая то. как это сделать попроще?
...
Рейтинг: 0 / 0
Работа с COM портом
    #38653341
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roerс событиями муть какая то. как это сделать попроще?
Где вы нашли муть?
...
Рейтинг: 0 / 0
Работа с COM портом
    #38653438
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилdes1roerс событиями муть какая то. как это сделать попроще?
Где вы нашли муть?
При использовании события есть еще возможность задать ReceivedBytesThreshold - если размер сообщения (ответного) постоянный,
то можно будет сразу читать из буфера.
...
Рейтинг: 0 / 0
Работа с COM портом
    #38653481
Фотография EDUARD SAPOTSKI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вот примерно так в простейшем случае это выглядет:

Код: 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.
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); 

        // Конструктор
        public Form1()
        {
            InitializeComponent();

            // Подписались на приход данных
            port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);

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

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

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

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

            // Чето посылаем
            port.Write("#10\r");
        }

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

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

            // Чето с ними делаем

            // Закрываем порт
            if(port.IsOpen) port.Close();
        }

    }
...
Рейтинг: 0 / 0
Работа с COM портом
    #38658248
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EDUARD SAPOTSKI , может оно и правильно вешать на событие. Но событие же не одно, приходит поток чисел, а в вашем примере дергается только несколько первых. Может таймаут больше поставить или как это решить можно
...
Рейтинг: 0 / 0
Работа с COM портом
    #38658284
Кифирчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roer,
кто вам мешает закрывать порт позже?
собирайте данные, и закрывайте как будет полный комплект.
все "блоки" которые нужно состыковать исходя из вашей специфики тут уже привели.

еще, предвижу сложность, не факт что всегда в indata будет строка '>-00.002'/
может получаться так
1-е срабатывание DataRecieve - '>-00.002>-00.002>-00.'
2-е срабатывание - '002>-00.002>-00.002'
то есть данные могут делиться на порции, видимо исходя из размера буфера.
надо будет собирать строку, проверять разделители.. тут вам и будет понятно когда закрыть порт.

еще, метод проб и ошибок, у меня показал, что после открытия/закрытия порта сразу хорошо бы делать comPort.DiscardInBuffer();
...
Рейтинг: 0 / 0
Работа с COM портом
    #38658309
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
млин, так один фиг приходится слип ставить чтобы получить все данные а не (3 первых символа) + (оставшиеся 12)
что-то вроде этого канает

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
       int i = 0;
        // Пришли данные
        void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            System.Threading.Thread.Sleep(100);
                // Получаем пришедшие данные
               string indata = port.ReadExisting();
                
                // Чето с ними делаем
            MessageBox.Show(i++.ToString() + " " + indata);
             
                // Закрываем порт
                if (port.IsOpen) port.Close();
       
        }


но тогда по сути отличия от моего метода немного. и еще - мне компилятор ругаецца если я даже напишу this.text = indata === Недопустимая операция в нескольких потоках: попытка доступа к элементу управления 'Form1' не из того потока, в котором он был создан.
...
Рейтинг: 0 / 0
Работа с COM портом
    #38658371
Кифирчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
port_DataReceived - выполняется в другом потоке, асинхронно с потоком формы, по этому и ошибка с доступом из нескольких потоков. нужно использовать Invoke

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
       int i = 0;
       string fullResult = "";
      
        // Пришли данные
        void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            SerialPort port = (SerialPort)sender;
            fullResult += port.ReadExisting();
            var s = fullResult.Split('>');
            if (s.Count() >= 5 && port.IsOpen)
            {
                port.Close();
                this.Invoke(new Action(() =>
                {
                    textBox1.Text = fullResult;
                }));
                fullResult = "";
            }
        }
...
Рейтинг: 0 / 0
Работа с COM портом
    #38658373
Фотография fortibransa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А зачем порт-то закрывать, нехай открыт пока прога работает.
...
Рейтинг: 0 / 0
10 сообщений из 35, страница 2 из 2
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Работа с COM портом
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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