Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
[Bicycle Reinventor]
324 / 262 / 109
Регистрация: 19.10.2011
Сообщений: 668
Записей в блоге: 2
1

COM-порт, работа с двумя формами и одним буфером обмена

26.03.2012, 12:35. Показов 1828. Ответов 2
Метки нет (Все метки)

Доброго времени суток.
Обращаюсь с вопросом, который повторяли, наверно, сотню и один раз. Но ответа, подходящего под специфическую задачу, я найти не смог, равно как и разобраться самостоятельно.

Итак, суть дела. Есть некое устройство на ком-порте. Мне в руки достался проект, который кое-как, но по ком-порту с этим устройством работает, и мне его придётся доделывать/переделывать.
Проблема возникла в связи со спецификой считывания данных. А считываются они по таймеру на главной форме: когда в ком-порте есть какие-либо данные, таймер это улавливает, главная форма считывает все данные из буфера, выводит их в RichTextBox и буфер обнуляет. Решение не самое лучшее, но до поры до времени всё работало без нареканий.
Проблема возникла, когда потребовалось создать вторую форму (дамп памяти), которая также должна "общаться" с устройством. Таймер на главной форме безжалостно сжирает все данные из буфера и второй форме просто ничего не достаётся. Поэтому я подумал над тем, чтобы изменить сам алгоритм чтения. Были мысли использовать чтение по событиям, но я не обладаю достаточными навыками для реализации такого метода самостоятельно.

Весь код прилагать не буду, ибо он слишком большой. Выложу лишь те функциональные части, которые и взаимодействуют с устройством через порт.

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
//
// Form1.cs основной класс
//
 
// ...
 
private DbgExch DebugCOM = new DbgExch(); // экземпляр класса, работающего с ком-портом
 
// ...
 
    private void timerConn_Tick(object sender, EventArgs e) // чтение по таймеру
        {
            timerConn.Stop();
            if (DebugCOM != null)
            {
                string s = DebugCOM.GetResponse(); // здесь происходит чтение буфера и его обнуление
                if (s.Length > 0)
                {
                    richTextBox1.Text += s;
                    responseString = s;
                    CursorStart = richTextBox1.SelectionStart = richTextBox1.Text.Length;
                }
                timerConn.Start();
            }
        }
// ...
и

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
//
// DbgExch.cs - класс работающий с ком-портом
//
 
    public DbgExch() // конструктор класса
    {
            response = new ArrayList();
            com = new SerialPort("COM4", 115200);
            com.ReadTimeout = 3000;
            com.WriteTimeout = 1000;
            com.DataBits = 8;           // 8 - default
            com.StopBits = StopBits.One;// One - default
            try
            {
                com.Open();
            }
            catch(Exception err)
            {
                MessageBox.Show("Error: " + err.Message);
                com_status = "Error opening COM4: " + err.Message;
            }
 
        responseSignal = new Object();
        reportSignal = new Object();
        receiveThread = new Thread(new ThreadStart(Receive));
        receiveThread.Start();
    }
 
// ...
 
    private void Receive() // получение данных с порта
    {
            byte[] receiveBuffer = new byte[MAX_PACKET_LENGTH];
            bool eol = false;
            int bytesRead = 0;
 
            while (true)
            {
        try
        {
                    bytesRead = 0;
                    eol = false;
 
                    while ((!eol) && (bytesRead < (MAX_PACKET_LENGTH-1)))
            {
                        try
                        {
                            bytesRead += com.Read(receiveBuffer, bytesRead, 1);
                            if (bytesRead < 1) continue;
                            if (bytesRead > (MAX_PACKET_LENGTH-1)) 
                            {
                                bytesRead = 0;
                                continue;
                            }
                            // Ждем первый символ          //ждем приема ДО таймаута или до eol
                            eol = bytesRead > 0;
                            continue;
                        }
                        catch (TimeoutException)
                        {
                            _timedOut = true;
                            bytesRead = 0;
                            continue;
                        }
            }
                    Encoding ascii = Encoding.ASCII;
                    string msg2 = Encoding.GetEncoding(1251).GetString(receiveBuffer, 0, bytesRead);
                    AddResponse(msg2);
 
                }
 
        catch (IOException)
        {
            // abort the thread
            System.Threading.Thread.CurrentThread.Abort();
        }
        catch (ObjectDisposedException)
        {
            if (receiveThread != null)
            {
                receiveThread = null;
            }
        }
            }
    }
 
// ...        
 
        private void AddResponse(string msg) // Заполнение буфера приёма
    {
        lock (responseSignal)
        {
                    ArrayList r = (ArrayList) response;
            r.Add( msg);
            Monitor.Pulse(responseSignal);
        }
    }
 
// ...
 
        public string GetResponse() // Чтение буфера и его обнуление
        {
            string rss = "";
            lock (responseSignal)
            {
                ArrayList r = (ArrayList)response;
                while ((r.Count > 0)/* && (N-- > 0)*/)
                {
                    rss += (String) r[0];
                    r.RemoveAt(0);
                }
            }
            return rss;
        }
Вот так обстоит дело. Подскажите, пожалуйста, идеи с примерами кода, как можно это переделать/дополнить, чтобы можно было ещё и со второй формы (дамп памяти устройства) читать данные.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.03.2012, 12:35
Ответы с готовыми решениями:

Работа с буфером обмена
Коллеги, как узнать - с какого листа текущей книги взята в буфер обмена некоторая область (и взята...

Работа с буфером обмена
Нужно чтобы при нажатии на кнопку, переменной присваивалось значение, находящееся в буфере обмена....

работа с буфером обмена
Как написать процедуру обработки события нажатия кнопки, которая реализует действия: сохранить...

Работа с буфером обмена
Добрый вечер. Непонятные вещи творятся с Clipboard, Создаю файл, копирую его в Нное место (Рабочий...

2
337 / 337 / 90
Регистрация: 04.03.2010
Сообщений: 648
26.03.2012, 12:57 2
а что мешает передавать данные из первой формы во вторую?
0
[Bicycle Reinventor]
324 / 262 / 109
Регистрация: 19.10.2011
Сообщений: 668
Записей в блоге: 2
26.03.2012, 14:35  [ТС] 3
Цитата Сообщение от andrew_w2k Посмотреть сообщение
а что мешает передавать данные из первой формы во вторую?
Это, безусловно, вариант, но хотелось бы переделать сам алгоритм. Уж очень он некрасивый - чтение по таймеру.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.03.2012, 14:35

Работа с буфером обмена
Всем привет .. Помогите пожалуйста ... Работаю на QT под Линукс ... Как мне записать информацию в...

Работа с буфером обмена
Подскажите. Есть ли возможность реализовать следующее: Файлы пдф, тиф, джипе хранятся в базе в...

Работа с буфером обмена
У меня на форме 17 эдитов и панель инструментов происходит так: пользователь вводит данные в...

Работа с буфером обмена
Как сделать копирование выделенного объекта в буфер windows и вставку из буфера объекта (или просто...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.