0 / 0 / 0
Регистрация: 22.02.2015
Сообщений: 88
1

Зависает форма при чтении из порта

09.12.2015, 12:17. Показов 1540. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Пишу программку, которая читает данные из серийного порта. Но форма повисает, пока чтение не закончится.
Подскажите, пожалуйста, как решить проблему? Я предполагаю, что проблема с потоками?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int port_read;
 
public void Show()
        {
Action action = () =>
              {
                  int t = serialPort1.BytesToRead; 
 
for (int i = 1; i <= t; i++)
                      {
                          port_read = serialPort1.ReadByte();
                          char str = (char)Port_read;
                          string str2 = str.ToString();
                          richTextBox1.AppendText(str2);
                      }
 
                  }
              };
            if (InvokeRequired)
                Invoke(action);
            else
                action();
        }}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.12.2015, 12:17
Ответы с готовыми решениями:

Подвисает при чтении COM порта
Доброго времени суток, сделал программу, которая читает данные из COM порта, строка кода которая...

Чтение из COM порта, При чтении из порта зависает read()
Каждому рано или поздно приходится программировать com порт. Вот и мой черед пришол. Я ужу умею:...

«Зависает» при чтении com порта
Здравствуйте! Алгоритм программы следующий: «Читать до конца файла» 1.1 Программный reset...

Зависает при чтении com порта
Привет всем, подскажите, пожалуйста, у меня есть прибор, с которого я считываю данные каждую...

3
Эксперт .NET
5545 / 4308 / 1218
Регистрация: 12.10.2013
Сообщений: 12,356
Записей в блоге: 2
09.12.2015, 12:22 2
Цитата Сообщение от Принтер Посмотреть сообщение
как решить проблему? Я предполагаю, что проблема с потоками?
Именно так.

Добавлено через 3 минуты
Не так давно делал пример для кого-то, вот посмотрите. Тут использование в консоли, но разницы нет.
Класс для работы с портом:
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
using System.Threading;
using System.IO.Ports;
using System.ComponentModel;
 
namespace SPMonitor_Test {
    public class PortMonitor : BackgroundWorker {
        SerialPort _port = null;
        bool _send = false;
        string _message = string.Empty;
 
        public PortMonitor(string portName, int portBaud) {
            _port = new SerialPort(portName, portBaud);
            this.WorkerReportsProgress = true;
            this.WorkerSupportsCancellation = true;
        }
        protected override void OnDoWork(DoWorkEventArgs e) {
            using (_port) {
                _port.Open();
                while (true) {
                    if (this.CancellationPending) {
                        e.Cancel = true;
                        return;
                    }
 
                    if (_send) {
                        WriteBlock(_message);
                    }
 
                    List<byte> readData = new List<byte>();
                    ReadBlock(readData);
                    if (readData.Count != 0) {
                        string outMsg = Encoding.ASCII.GetString(readData.ToArray());
                        this.ReportProgress(0, outMsg);
                    }
                    Thread.Sleep(500);
                }
            }
        }
        public void SendMessage(string msg) {
            _message = msg;
            _send = true;
        }
        void WriteBlock(string msg) {
            byte[] writeData = Encoding.ASCII.GetBytes(msg);
            _port.Write(writeData, 0, writeData.Length);
            _send = false;
        }
        void ReadBlock(List<byte> temp) {
            for (int i = 0; i < 10; i++) {
                int readCount = _port.BytesToRead;
                if (readCount == 0) {
                    Thread.Sleep(50);
                }
                else {
                    byte[] arr = new byte[readCount];
                    _port.Read(arr, 0, readCount);
                    temp.AddRange(arr);
                    return;
                }
            }
        }
    }
}
Пример использования:
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
 
namespace SPMonitor_Test {
    class Program {
        static void Main(string[] args) {
            PortMonitor monitor = new PortMonitor("COM1", 9600);
            monitor.ProgressChanged += new ProgressChangedEventHandler(monitor_ProgressChanged);
            monitor.RunWorkerAsync();
            string msg;
            while (true) {
                Console.WriteLine("Enter message to send to port:");
                msg = Console.ReadLine();
                monitor.SendMessage(msg);
            }
        }
 
        static void monitor_ProgressChanged(object sender, ProgressChangedEventArgs e) {
            string outMsg = e.UserState.ToString();
            Console.WriteLine("Message from port: {0}",outMsg);
        }
    }
}
Подстроите под свои нужды.
1
0 / 0 / 0
Регистрация: 22.02.2015
Сообщений: 88
09.12.2015, 18:12  [ТС] 3
Спасибо, попытаюсь понять, но для меня это пока сложновато, честно говоря...
0
0 / 0 / 0
Регистрация: 22.02.2015
Сообщений: 88
19.12.2015, 23:21  [ТС] 4
Подниму тему. Я попробовал через background и Thread, но почему-то читает криво. Сделал вот так, и все хорошо, но до тех пор, пока не закрываю порт. Потом все повисает и не выдается никакой ошибки. Если я правильно понимаю, то нужно закрыть поток? Подскажите, пожалуйста, как это сделать в данной ситуации?
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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;
using System.Threading;
 
namespace Тест
{
    public partial class Form1 : Form
    {
        string str2;
        public void RICH()// ВЫВОД В RICHTEXTBOX ДАННЫХ С ПОРТА
        {
            richTextBox1.AppendText(str2.ToString());
        }
        delegate void RICH_delegate();
        private void Rbox()
        {
            if (InvokeRequired)
               Invoke(new RICH_delegate(RICH));
            else
                RICH();
        }
        public Form1()
        {
            InitializeComponent();
        }
        public void Show() 
        {
            
                    int t = serialPort1.BytesToRead;
 
                    for (int i = 1; i <= t; i++)
                    {
                        int port_read = serialPort1.ReadByte();
                        char str = (char)port_read;
                        str2 = str.ToString();
                        Rbox();
                    }
                   
 
        }
 
        private void btn_OPEN_Click(object sender, EventArgs e)
        {
            serialPort1.Open();//ОТКРЫВАЕМ ПОРТ
        }
 
        private void btn_CLOSE_Click(object sender, EventArgs e)
        {
                      
            serialPort1.Close(); // ЗАКРЫТЬ ПОРТ    
        }
 
        private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            Show();
        }
 
    }
    }
0
19.12.2015, 23:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.12.2015, 23:21
Помогаю со студенческими работами здесь

При чтении com порта зависает приложение
Вот эта строка кода вешает всё приложение: textBox1-&gt;Text = serialPort1-&gt;ReadLine(); Если её...

Зацикливание при чтении COM-порта в функции ReadFile()
Создал класс Transmit для работы с виртуальным COM-портом ПК. Transmit.h #include...

Откуда при чтении из COM-порта берутся 99 байт?
Здравствуйте! Этот отрывок кода взят из рабоче программы, которая работает около 2-х лет и судя по...

Работа функции FlushFileBuffers при синхронном чтении из Com-порта
Всем здравствуйте. Пытаюсь освоить работу с Com-портом средствами API. В описании к функции...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru