Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/21: Рейтинг темы: голосов - 21, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 20.11.2014
Сообщений: 4

Зависание программы считывания данных с DHT22

20.11.2014, 13:49. Показов 4655. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго дня.
Имеется ардуино с датчиком DHT22, которая шлет данные с датчика по последовательному порту.
Стояла задача, написать программу для ПК, которая выводила бы эти данные с датчика на экран.
Программа писалась на Visual Studio C# 2010 и это моя первая не "учебная" программа)

Программа работает и показывает данные как и предполагалось, но через некоторое время зависает 0_0
В чем заключается моя ошибка?

Код программы:
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
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; // для работы с СОМ портом
using System.IO.Ports;
using System.Timers; // Для работы с таймером
 
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public String c;
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            serialPort1.Close();
            Close();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            serialPort1.Open();
        }
 
        private void button3_Click(object sender, EventArgs e)
        {
            timer1.Enabled = true;
            
        }
 
        private void timer1_Tick(object sender, EventArgs e)
        {
            textBox1.Text = serialPort1.ReadLine();
        }
    }
}
Скетч с ардуино:
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
#include "DHT.h"
 
#define DHTPIN 2     // what pin we're connected to
 
// Uncomment whatever type you're using!
//#define DHTTYPE DHT11   // DHT 11 
#define DHTTYPE DHT22   // DHT 22  (AM2302)
//#define DHTTYPE DHT21   // DHT 21 (AM2301)
 
// Connect pin 1 (on the left) of the sensor to +5V
// Connect pin 2 of the sensor to whatever your DHTPIN is
// Connect pin 4 (on the right) of the sensor to GROUND
// Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor
 
DHT dht(DHTPIN, DHTTYPE);
 
void setup() {
  Serial.begin(9600); 
  Serial.println("DHTxx test!");
 
  dht.begin();
}
 
void loop() {
  // Wait a few seconds between measurements.
  delay(1000);
 
  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  // Read temperature as Celsius
  float t = dht.readTemperature();
  
  // Check if any reads failed and exit early (to try again).
  if (isnan(h) || isnan(t)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }
 
  Serial.print("Humidity: "); 
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("Temperature: "); 
  Serial.print(t);
  Serial.println(" *C ");
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.11.2014, 13:49
Ответы с готовыми решениями:

Считывания данных с com-port!
Есть массив данных которые я получаю из ком порта в реальном времени часть данных есть ненужные, а остальные нужно пустить на дальнейшую...

Зависание программы
Написал программу для подсчета Md5Hash изображений, через openFileDialog загружаю названия изображений в listBox и считаю программа...

Зависание программы
Сижу пыхчу уже 3 дня и не могу никак найти решение. Суть программы в том что ты вводишь в TextBox число от 2001 до 2018 и программа...

7
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
20.11.2014, 14:48
Цитата Сообщение от Yuki007 Посмотреть сообщение
через некоторое время зависает
Возможно, перестают приходить данные с устройства. А у вас в программе этот момент никак не учтен, просто по таймеру считывается строка из порта.
Включите параллельно вашей программе монитор порта и посмотрите, приходят ли данные от устройства после того, как программа зависла.
0
0 / 0 / 0
Регистрация: 20.11.2014
Сообщений: 4
20.11.2014, 15:53  [ТС]
Цитата Сообщение от insite2012 Посмотреть сообщение
Возможно, перестают приходить данные с устройства. А у вас в программе этот момент никак не учтен, просто по таймеру считывается строка из порта.
Включите параллельно вашей программе монитор порта и посмотрите, приходят ли данные от устройства после того, как программа зависла.
Ардуино продолжает слать данные с датчика в момент зависания, это было проверено подключенным дисплеем который параллельно показывал данные.
При попытке запустить сторонний монитор порта, пишет что порт занят.
Сам же Visual studio в "выводе" во время теста пишет такие сообщения "Поток '<Без имени>' (0x888) завершился с кодом 0 (0x0).", (три восьмерки не постоянны, числа все время меняются).

Когда программа зависает, она не просто перестает обновлять данные, она именно зависает - перестает реагировать на что либо и закрывается только диспетчиром задач.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
20.11.2014, 16:02
Yuki007, формат приходящих данных известен (количество приходящих данных)? Может, имеет смысл вынести чтение в отдельные поток с ожиданием наличия данных в приемном буфере порта (проверяется через свойство SerialPort.BytesToRead) и чтение только при наличии данных (или выход по таймауту, если данных нет).
0
0 / 0 / 0
Регистрация: 20.11.2014
Сообщений: 4
20.11.2014, 16:30  [ТС]
Цитата Сообщение от insite2012 Посмотреть сообщение
Yuki007, формат приходящих данных известен (количество приходящих данных)? Может, имеет смысл вынести чтение в отдельные поток с ожиданием наличия данных в приемном буфере порта (проверяется через свойство SerialPort.BytesToRead) и чтение только при наличии данных (или выход по таймауту, если данных нет).
Формат приходящих данных известен, это простая текстовая строка.
А можете подсказать как это сделать, а то я впервые пишу такую программу...
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
20.11.2014, 16:43
Цитата Сообщение от Yuki007 Посмотреть сообщение
Формат приходящих данных известен
Опишите формат приходящих данных (размер приходящего от устройства пакета в байтах) и интервал между ними. Да, и скорость порта укажите, на какой требуется работать.
0
0 / 0 / 0
Регистрация: 20.11.2014
Сообщений: 4
23.11.2014, 20:10  [ТС]
Цитата Сообщение от insite2012 Посмотреть сообщение
Опишите формат приходящих данных (размер приходящего от устройства пакета в байтах) и интервал между ними. Да, и скорость порта укажите, на какой требуется работать.
Вроде разобрался как мерить.
Тип данныйх - строка, размер принимаемых данных 4 байта, интервал поступления данных 0.5 герца (раз в две секунды), скорость порта 9600 бод.

Дополнение по зависанию, программа перестает реагировать управление, но еще некоторое время обновляет данные с датчика (но окно уже зависло).

Пример данных с порта:
"<LF>Humidity: 34.50 %<HT>Temperature: 26.30 *C <CR> [len=41]
<LF>Humidity: 34.10 %<HT>Temperature: 26.40 *C <CR> [len=41]"
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
23.11.2014, 20:49
Yuki007, как я понял вашу задачу, вам необходимо просто прослушивать порт, без записи в него данных?
Тогда примерно вот так. Как вы понимаете, вашего устройства у меня нет, поэтому писал только примерно. Подкорректируйте под свои цели.
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
using System.IO.Ports;
using System.Threading;
using System.Threading.Tasks;
 
namespace ConsoleApplication7 {
    class Program {
        static SerialPort port = new SerialPort();
 
        static void Main(string[] args) {
            port.BaudRate = 9600;
            port.PortName = "COM1";
            //Тут дальше конфигурируем порт...
 
            Task.Factory.StartNew(() => { ReadDataFromPort(); });
            Console.ReadLine();
        }
        static void ReadDataFromPort() {
            using (port) {
                port.Open();
                while (true) {
                    int index;
                    for (index = 0; index < 10; index++) {
                        if (port.BytesToRead == 4) {
                            byte[] dataFromPort = new byte[port.BytesToRead];
                            for (int j = 0; j < dataFromPort.Length; j++) {
                                dataFromPort[j] = (byte)port.ReadByte();
                            }
                            string data = Encoding.Default.GetString(dataFromPort);
                            Console.WriteLine(data);
                        }
                        else
                            Thread.Sleep(500);
                    }
                    if (index == 10) {
                        Console.WriteLine("No data presents!");
                        return;
                    }
                }
            }
        }
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.11.2014, 20:49
Помогаю со студенческими работами здесь

Зависание программы/потока
Здравствуйте. Есть такой код Thread clientDeleteThread = new Thread(new ThreadStart(DeleteUpdate)); ...

Код для считывания данных курса валют
Вобщем пишу незатейливую ( может наоборот) программку, которая считывает данные с сайта(ов) курсы валют, для последующей конвертации нужной...

Зависание программы при загрузке данных из БД
Здравствуйте! Есть такая проблема когда большое количество строк считывается из БД, то прога временно повисает пока все не загрузится. я...

Постепенное выполнение программы/зависание программы при выполнении
Собственно есть вопрос, возможно очень даже глупый, но все же спрошу: почему при выполнении большого кол-ва операций программа повисает, а...

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


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru