Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Побайтный прием данных с Com порта, пытаемся создать dialer

19K
14 июля 2010 года
WantToProg
63 / / 19.01.2009
Доброе время суток. Возник вероятно не сложный вопрос, к которому не могу найти подходящего решения.
Пишу программу, которая будет звонить на мой телефон, являющийся шлюзом.

Модем на компьютере висит на Com10, но не суть.
В программе я отправляю последоватьльно AT команды, и жду ответа от модема. Если с командами ATZ, AT+CSQ проблем не возникает, то команда дозвона ATD отвечает не сразу.
Результат обработки команды получаю следующим образом:
 
Код:
memPort.Open();//Open port
//atz query, need ok
ComPort.Write(ATZ, 0, ATZ.Length);
ComPort.Write(CR, 0, CR.Length);
Thread.Sleep(WaitTime);
byteRecieved = memPort.BytesToRead;
mBytes = new byte[byteRecieved];
ComPort.Read(mBytes, 0, byteRecieved);                
reply = Encoding.ASCII.GetString(mBytes);
Invoke(new ReceiveHandler(UpdateDisplay), new object[] { reply });

От WaitTime зависит количество принятых байтов, а мне бы хотелось переделать таким образом, что бы байты принимались последовательно до тех пор, пока они есть. В случае ATD мне необходимо WaitTime устанавливать достаточно большим (50-80 секунд).
Как бы мне этого избежать, подскажите пожалуйста. Очень надеюсь на вашу помощь.
14
14 июля 2010 года
Phodopus
3.3K / / 19.06.2008
ЕМНИП, ответ at-команд заканчивается переводом строки или двойным переводом
13K
14 июля 2010 года
fawkes
21 / / 04.01.2006
по истечению таймаута смотришь в буфер, если есть данные читаешь, если не принял CRLF, но при этом данные в буфере были, то ставишь снова интервал ожидания, пока не примешь CRLF, если не было, то по обстоятельствам, допустим на ту же ATD можно ставить флаг двойного интервала ожидания первого байта, но лучше делать асинхронный обмен, отправил команду и забыл, по истечению секунды, или нескольких секунд, проверяешь буфер, делишь на строки по окончанию CRLF и парсишь по принятым командам, в моем случае мопед отвечал повтором команды без префикса AT( ну в случае с CSQ было - +CSQ: 26,5CRLF...) вот и сравнивал я ответы последовательно с каждой известной командой, благо их было не особо много.

На всякий случай напишу, что CR = 0x0D, LF = 0x0A
19K
15 июля 2010 года
WantToProg
63 / / 19.01.2009
В том то и дело, что я не очень хорошо понимаю структуру связи через модем.
Иногда при дозвоне, в качестве ответа я получаю
 
Код:
41 54 44 38 39 31 31 36 31 35 34 36 39 33 0D 0D   ATD89116154693..
 0A 43 4F 4E 4E 45 43 54 20 39 36 30 30 0D 0A      .CONNECT 9600..

А иногда просто
 
Код:
0A 43 4F 4E 4E 45 43 54 20 39 36 30 30 0D 0A      .CONNECT 9600..

И конечно NO.CARRIER
Таким образом мы имеем дважды команду CR и New line. Как определить какая из них нужная, я не знаю :)
Пока все еще остановился на минуте ожидания приема ответа.
13K
15 июля 2010 года
fawkes
21 / / 04.01.2006
41 54 44 38 39 31 31 36 31 35 34 36 39 33 0D 0D ATD89116154693..
0A

вот оно и есть, наверняка ATD891161546930x0D это то, что ты отправил, модем может повторять введенные команды. а второе 0x0D 0x0A это и есть конец строки. Разбивай строки по 0x0d 0x0a, или просто по 0x0a и будет тебе счастье, потом просто поиск что он ответил. Если отвечает без повторения команды, то какая разница, все равно присылает конец строки, а дальше дело техники.
19K
20 июля 2010 года
WantToProg
63 / / 19.01.2009
Спасибо, разобрался
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог