Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.02.2014, 01:18   #1
digiwo
Пользователь
 
Аватар для digiwo
 
Регистрация: 13.01.2014
Сообщений: 45
По умолчанию Таймер?

Попробуем по другому.
Что нужно:
Есть метод к котором выполняется считывание с com порта.
Иногда данные долго не возвращаются или не успеваю вовремя послать подтверждение. Соответственно программа ждет данные, а рация их не посылает. Нужно сделать чтоб если скажем в течении 30 секунд ничего не происходило, то вызывался другой метод или выполнялась определенная команда.

Как сделать лучше. Если можно с примеров. Вот это прочел, но не понял.
digiwo вне форума Ответить с цитированием
Старый 02.02.2014, 01:53   #2
alexusankov
Пользователь
 
Регистрация: 04.01.2011
Сообщений: 66
По умолчанию

Толь я упоротый, то ли твое сообщение отображается частями, но я его не осилил.
Код:
Иногда данные долго не возвращаются или не успеваю вовремя послать подтверждение.
Откуда возвращаются, и какое подтверждение?
Код:
ждет данные, а рация их не посылает.
рация?
Код:
Вот это прочел, но не понял.
Да я тоже не понял вот это, если честно.
-------------------------
Ты пытаешься считать данные с com порта, но порой они не приходят?
Так собсна, у порта есть таймаут, и нужно знать как ты именно читаешь??
Имеется синхронное и асинхронное чтение с порта. Имеются разные способы.
Насколько я понял твой метод, работает с ком-портом, но периодически ты не понимаешь что делать с ветвлением алгоритма, если данные не пришли?

Последний раз редактировалось alexusankov; 02.02.2014 в 02:00.
alexusankov вне форума Ответить с цитированием
Старый 02.02.2014, 01:59   #3
Streletz
Старожил
 
Регистрация: 03.01.2014
Сообщений: 2,870
По умолчанию

Можно попробовать реализовать тайм аут. Общий принцип такой.
Задаёте в таймере интервал, допустим 500 мс (значение исключительно для примера). В обработчике помимо метода прослушивающего порт, делаете подсчёт времени.
Каждый тик таймера, т.е в данном случае каждые 500 мс, слушаете порт и увеличиваете счётчик времени. Если данные пришли, до истечения тайм аута (30 с), то делаете одно. Если в течении тайм аута ничего не произошло делаете другое.
Приблизительно как-то так...
Streletz вне форума Ответить с цитированием
Старый 02.02.2014, 02:03   #4
alexusankov
Пользователь
 
Регистрация: 04.01.2011
Сообщений: 66
По умолчанию

Цитата:
Сообщение от Streletz Посмотреть сообщение
Можно попробовать реализовать тайм аут.
Приблизительно как-то так...
Пардон, зачем реализовывать то, что уже имеется?
Если событие чтения синхронное, то дальнейший код попросту сработает после таймаута.
Вопрос в том - что автор там написал?
P.s.s хотя я пересмотрел его предыдущую тему, и вроде понял. Щас подумаю.

Последний раз редактировалось alexusankov; 02.02.2014 в 02:05.
alexusankov вне форума Ответить с цитированием
Старый 02.02.2014, 02:17   #5
digiwo
Пользователь
 
Аватар для digiwo
 
Регистрация: 13.01.2014
Сообщений: 45
По умолчанию

alexusankov

Я пытаюсь сделать программу, которая считывает с рации по com порту GPS данные, и потом обрабатывает. Данные читать я кое как научился.
Но заметил проблему, что если рации не послать "ack" после 3 раз, то рация ждет новой команды. Так как протокола у меня нет, и всё вычитываю через порт сканер, то иногда приходят данные которых у меня нет как образца, и соответственно моя программа никак не реагирует. Получается ситуация что рация послала 3 раза и ждет новой команды, а моя программа получила данные, но не знает что с ними делать, и ждет новых данных. Для этого и хотелось бы, если скажем в течении 30 секунд ничего не приходит, то посылается команда. Или например заметил что иногда не закрывается порт. То есть данные все отослал для завершения соединения, меняю значение в bool переменной, после этого должен порт закрыться, но не вижу закрытия, и программа висит.
digiwo вне форума Ответить с цитированием
Старый 02.02.2014, 02:25   #6
Streletz
Старожил
 
Регистрация: 03.01.2014
Сообщений: 2,870
По умолчанию

ИМХО в этом случае необходимо самому в программе слушать порт и контролировать его состояние. Аппаратные порты - не управляемые ресурсы. Их необходимо обязательно освобождать.
Проверьте работу алгоритма закрытия порта по точкам останова. Закрытие порта происходит во всех ветках, которые его используют? Защищайте алгоритмы работы с неуправляемыми ресурсами с помощью try... finally.
На всякий случай в помощь:
Работа с COM-портами в .NET (C#)
Streletz вне форума Ответить с цитированием
Старый 02.02.2014, 02:40   #7
alexusankov
Пользователь
 
Регистрация: 04.01.2011
Сообщений: 66
По умолчанию

Пардон, но под рукой нет ПК с студией, а с таблетки писать несподручно, и я слегка пьян. Судя по первым требованиям, в чем заключается трудность я так и не понял.
Если вам необходимо пробовать получить известные данные с компорта в течении 30 сек, и далее в зависимости от результата выполнить код, то банальный топорный пример с костылями : (пардоньте, я пьян и за планшетом)
Код:
class Program
    {
        static void Main(string[] args)
        {
            Thread ReadThread = new Thread(ReadData);
            ReadThread.Start(); //запускаем поток чтения
        }

        static void ReadData()
        {
            byte Count = 0;
            while (Count < 30)
            {
                byte[] query = { 0xFF, 0xFF }; // запрос
                byte[] Data = new byte[128]; // создаем чистый буфер
                SerialPort port = new SerialPort(); // параметры подключения
                port.Write(query, 0, 2); // отправляем запрос
                Thread.Sleep(1000);      // тормозим поток на 1 секунду
                port.Read(Data, 0, 64); // забираем 64 байта с буфера 
                if (CheckData(Data) == true)            // если содержимое буфера прошло проверку выходим из цикла
                {
                    Data.CopyTo(Result, 64);
                    Count = 41; 
                }
                else Count++;                            // иначе увеличиваем счетчик цикла
            }

            if (Count > 40) 
            {
                // данные были получены
            }
            else
            {
                // данные не были получены
            }
        }

        static bool CheckData(byte[] Data)
        {
            // проверяем считались ли данные
            int CheckSumm = 0;
            foreach (byte OneByte in Data) CheckSumm += OneByte; // сумма всех байт. Нулевой буфер - данные не получены
            if (CheckSumm > 0) return true;
            else return false;
        }
    }
А вот если вы хотя бы покажете КАК именно вы читаете данные, и читаете ли вы их синхронно (тупо с метода), либо асинхронно (вызываете метод с помощью асинхронного делегата, дибо инициируете в потоке) - то вым результативно помогут

Последний раз редактировалось alexusankov; 02.02.2014 в 02:43.
alexusankov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Таймер Руслан(2) Общие вопросы C/C++ 0 05.06.2012 16:54
Таймер Рулан Общие вопросы C/C++ 0 02.06.2012 13:49
QT: Таймер Krasi Помощь студентам 5 12.11.2011 08:15
таймер в C# Munky Помощь студентам 2 15.04.2010 20:30
Таймер Sergeo_89 Общие вопросы Delphi 11 24.01.2010 16:38