Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Трудности с таймером, АОН постоянно определяет номер 
V
    Опции темы
okaton
Дата 18.12.2009, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 24.11.2006

Репутация: нет
Всего: нет



Доброго времени суток. Благородные доны помогите подправить код. Написал АОН, но возникли трудности в этом месте:

Код

        public string str = "";
        private void timer1_Tick(object sender, EventArgs e)
        {   
            while (port.BytesToRead > 0)
            {
                try
                {
                    str = port.ReadLine();   
                    listBox1.Items.Add(str);                    
                    CallerID();                    
                }
                catch { }
            }  
        }

        public void CallerID()
        {
            string number = "";
            if (str.StartsWith("+CLIP:"))
            {
                number = str.Substring(str.IndexOf("\"") + 1, str.IndexOf(",") - str.IndexOf("\"") - 2);
                listBox2.Items.Add("Входящий звонок");
                listBox2.Items.Add("Время: " + DateTime.Now);
                listBox2.Items.Add("Номер определен: " + number);
                listBox2.Items.Add(" ");
            }
        }


Проблема в том, что пока телефон звонит номер постоянно определяется, т.к. он в таймере. Что тут можно предпринять? Кроме выключения таймера, потому что его потом как-то нужно включать, а это "как-то" - RING (при прослушивании порта), но он возникает через определенные промежутки времени при входящем звонке. Поэтому как таймер выключится, так сразу и включится. Условие по времени между рингами это вообще не вариант. Может флаг на открытую линию? Но что-то не получается. В общем мне на ум больше ничего не приходит. Подайте пожалуйста идею.

PM MAIL   Вверх
explorer
Дата 18.12.2009, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 104
Регистрация: 26.2.2008

Репутация: 1
Всего: 2



Как вариант (правда в случае, если RING не возникает слишком часто). Поступает звонок первый раз - запустить таймер и выставить флаг "разговора". При повторном RING проверять, не идет ли разговор (по флагу). Елси идет, значит и таймер не нужен. Если нет, то все с начала. А флаг разговора должен быть убран сразу после разрыва соединения.

Добавлено @ 16:42
А еще  можно без проверок флагов и таймера. Например, при первом RING выставляем свойство LineBuzy = true вот так:

Код

private bool lineBuzy;
public bool LineBuzy
{
     get { return lineBuzy; }
     set 
    {
       if (value != lineBuzy)
       {
            lineBuzy = value;
            if (value)
                 if (OnNewSession != null)
                    OnNewSession();
       }
    }
}


Ну и в обработчике события OnNewSession() вызывать
Код

while (port.BytesToRead > 0)
            {
                try
                {
                    str = port.ReadLine();   
                    listBox1.Items.Add(str);                    
                    CallerID();                    
                }
                catch { }
            }  


Это сообщение отредактировал(а) explorer - 18.12.2009, 16:43
--------------------
 
PM MAIL WWW ICQ   Вверх
okaton
Дата 18.12.2009, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 24.11.2006

Репутация: нет
Всего: нет



explorer, Поправка. Пока поступает звонок и не снята трубка модем шлет уведомления RING непрерывно (наверное, ну может через какой-то интервал). После определения номера можно отключить таймер, но как его потом включить? Значит нужен еще один таймер (где-то же уведомления должны обрабатываться). Можно поставить условие на функцию CallerID() и подписать его на флаг. Который отключится после определенного времени при отсутствии RING, но это криво :(

Добавлено @ 17:02
explorer, кхм, спасибо smile
я дико извиняюсь, но я нифига не понял  smile 

Это сообщение отредактировал(а) okaton - 18.12.2009, 17:04
PM MAIL   Вверх
okaton
Дата 21.12.2009, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 24.11.2006

Репутация: нет
Всего: нет



Кто знает как использовать SerialPinChange ?
PM MAIL   Вверх
okaton
Дата 21.12.2009, 22:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 24.11.2006

Репутация: нет
Всего: нет



Ну вот, приплыл: Недопустимая операция в нескольких потоках: попытка доступа к элементу управления "richTextBox1" не из того потока, в котором он был создан :(

Код

        void comport_PinChanged(object sender, SerialPinChangedEventArgs e)

        {
            if (e.EventType == SerialPinChange.Ring)
            {
                CallerID();
            } 
        }
        
        public string str = "";
        public void CallerID()
        {
            string number = "";        

            if (str.StartsWith("+CLIP:"))
            {
                number = str.Substring(str.IndexOf("\"") + 1, str.IndexOf(",") - str.IndexOf("\"") - 2);
                listBox2.Items.Add("Входящий звонок");
                listBox2.Items.Add("Время: " + DateTime.Now);
                listBox2.Items.Add("Номер определен: " + number);
                listBox2.Items.Add(" ");
                port.WriteLine("AT+CLIP=0");//АОН    
            }  
        }



Это сообщение отредактировал(а) okaton - 21.12.2009, 22:19
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1111 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.