Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Другие темы раздела
C# Уважаемые программисты, какую книгу вы учили У меня такой вопрос к тем кто в области C# уже не первый год, и знает его на 5 Какие книги вы изучали? Пусть отвечают люди те, у кого постов от 1к! или модеры! https://www.cyberforum.ru/ csharp-beginners/ thread528170.html Объявите класс TCar, создающий тип "Автомобиль" C#
Объявите класс TCar, создающий тип «Автомобиль». Определите элементы-данные класса: ― марка автомобиля; ― год выпуска; Предусмотрите следующие конструкторы класса: ― по умолчанию; ― получающий параметры; Напишите функции-методы класса: ― ввода–вывода данных об автомобиле; ― определения, относится ли год выпуска автомобиля к какому-либо году, значение которого передается через параметр;
C# Соединить файлы с возможностью восстановления исходных есть два файла как их склеить? например тоталкомандер и склеивает и разбивает файлы как это реализовать на C# как склеить строки знаю но если это картинка или программа? или архив rar,zip? https://www.cyberforum.ru/ csharp-beginners/ thread528112.html C# Программа для прохождения анкетирования. Способы реализации Требуется помощь со следующей задачей: Дан текстовый файл вопросов анкеты. Каждый вопрос заканчивается знаком "?". Программа должна выводить вопросы на экран по одному и запоминать ответы (из одной строки), даваемые пользователем. Предусмотреть возможность отложить вопрос нажатием "Enter" — тогда он должен быть задан позже. Когда ответы на все вопросы получены, программа создает текстовый... https://www.cyberforum.ru/ csharp-beginners/ thread528098.html
Описать класс "Предложение" C#
В классе определить поле с длиной максимальной длиной предложения, автовычисляемое поле с количеством знаков пунктуации в предложении, непараметризированный метод, возвращающий предложение, записанное прописными буквами со словами в обратном порядке, параметризированный метод, возвращающий слово из предложения с заданным индексом.
C# Простенький конвертер различных величин Добрый день. Есть три комбобокса и три текстбокса и три батона. 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; https://www.cyberforum.ru/ csharp-beginners/ thread528004.html
C# Программное создание и запись *.xml-файла, как осуществить и где почитать https://www.cyberforum.ru/ csharp-beginners/ thread527891.html
Здравствуйте! Подскажите как программно записать *.xml файл? В самой программе много разных контролов будет, ну вот к примеру как создать *.xml файл <?xml version="1.0" encoding="Windows-1251"?> <test> <Theme>Записаный программно XML файл</Theme> <qw num="5">Тег с атрибутом</qw> //Здесь num = textBox1.Text </test> вида? Значение атрибута num записать равным значению textBox1. И...
Метод Select. Построение диаграммы в Excel C#
Помогите,пожалуйста, устранить ошибку:"Метод Select из класса Range завершен неверно". Необходимо построить диаграмму по двум выбранным столбцам в Excel Excel.Range excelcells = Sheet_.get_Range("A8:A35", "Q8:Q35"); excelcells.Select(); Excel.Chart chart = excelapp.ActiveWorkbook.Charts.Add(After: excelapp.ActiveSheet); ...
C# Чат: проблемы с кодировкой https://www.cyberforum.ru/ csharp-beginners/ thread527853.html
Как заставить понимать его русские символы?
C# Как от текущей даты отнять 7 дней Народ, как от текущей даты получить дату, на 7 дней меньшую? Subtract() пробовал использовать - не получилось. :( https://www.cyberforum.ru/ csharp-beginners/ thread527798.html
Консоль: объясните работу кода C#
Пишу консольное приложение, которое строку с истфиксной записи будет превращать в постфиксную, например "1+(2-3)*4" превращать в "123-4*+" метод alg(); на данном этапе должен добавлять цифры со строки в stack, но нифига не добавляет. using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace BPR
C# Асинхронный клиент-сервер. Рассылка от сервера Здравствуйте! Пишу клиент - серверное приложения на асинхронных сокетах. Задача состоит в том, чтобы при получении сервером определенного сообщения от одного из клиентов, сервер отправлял всем подключившимся клиентам уведомление (похоже на систему оповещения). На данный момент на клиенте по таймеру отсылается проверка на наличие уведомлений, так как данные от сервера клиент получает только в... https://www.cyberforum.ru/ csharp-beginners/ thread527736.html
[Bicycle Reinventor]
332 / 270 / 109
Регистрация: 19.10.2011
Сообщений: 668
Записей в блоге: 2
0

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

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

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

Итак, суть дела. Есть некое устройство на ком-порте. Мне в руки достался проект, который кое-как, но по ком-порту с этим устройством работает, и мне его придётся доделывать/переделывать.
Проблема возникла в связи со спецификой считывания данных. А считываются они по таймеру на главной форме: когда в ком-порте есть какие-либо данные, таймер это улавливает, главная форма считывает все данные из буфера, выводит их в 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;
        }
Вот так обстоит дело. Подскажите, пожалуйста, идеи с примерами кода, как можно это переделать/дополнить, чтобы можно было ещё и со второй формы (дамп памяти устройства) читать данные.

Вернуться к обсуждению:
COM-порт, работа с двумя формами и одним буфером обмена C#
0
Заказать работу у эксперта
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.03.2012, 12:35
Готовые ответы и решения:

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

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

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

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

2
26.03.2012, 12:35
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.03.2012, 12:35
Помогаю со студенческими работами здесь

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

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

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

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

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