Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с COM-портом, алгоритм(+) 
:(
    Опции темы
JoyEx
Дата 4.1.2006, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дядя
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 21.6.2005
Где: Москва, РФ

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



Цитата(Dreamer_0x01 @ 2.1.2006, 23:30 Найти цитируемый пост)

Да вы я тоже вижу фанатеете от текстов, произносимых Жуковым ;)

Да. Олег Жуков классный был человек.

Бугемот, а куда Вы пропали? У Вас всё получилось?


--------------------
Если ты уже никого не боишься, значит ты самый страшный 
PM IM ICQ AOL YIM MSN   Вверх
Бугемот
Дата 5.1.2006, 02:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Всем здравствуйте.
Цитата(JoyEx @ 4.1.2006, 23:05 Найти цитируемый пост)

Бугемот, а куда Вы пропали? У Вас всё получилось?

Частично - с общим таймаутом на чтение работает с такими интерваллами:
ct.ReadTotalTimeoutMultiplier = 2;
ct.ReadTotalTimeoutConstant = 1;
Это, если честно, многовато. Но при меньших значениях данные не читаются. Придется подбирать все же таймауты, в документации я не нашел этого значения.
Ну а в остальном - все работает smile Порт опрашиваю по событию WM_TIMER с определенным интервалом.
Вам очень большое спасибо за советы !!!

Это сообщение отредактировал(а) Бугемот - 5.1.2006, 03:14
PM MAIL   Вверх
Бугемот
Дата 10.1.2006, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Всем снова здравствуйте.
Программе мне была нужна для отправки SMS сообщений, по работе приходится много отсылать, вот и хочу сделать для себя небольшой терминал. Вот так отправляю:
Вот PDU:
07919732929090F0110B0B919732426654F70000A703D36110, программа pduspy раскодирует корректно.
пишу отправку:
AT+CMGS=24 (пробовал и макс. длину 140 - ничего)
07919732929090F0110B0B919732426654F70000A703D361101A (1A - это Ctrl+Z)
И ничего (
Что неправильно? и как по-другому можно сформировать Ctrl-z?

Попробовал просто сохранить сообщение в памяти, тоже не получается. Похоже, Ctrl-Z я неправильно посылаю.
Читаю сообщения и любую доступную служебную информацию с телефона через АТ-команды - без проблем
PM MAIL   Вверх
Dreamer_0x01
Дата 11.1.2006, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


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

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



Я бы посоветовал создать отдельный топик на эту тему. И раздел вроде про мобильные устройства тоже где-то видел, может, там помогут...


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
bel_nikita
Дата 11.1.2006, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

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



Бугемот
посмотри здесь: codeproject.com.
Или здесь: Поиск. Ввведи Serial и нажми Search


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Бугемот
Дата 11.1.2006, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А какие таймауты для записи примерно будут для порта со скоростью 57600Кб. На конце порта - сотовый телефон.
я выставил вот такие
Код

    ct.WriteTotalTimeoutMultiplier = 2;
    ct.WriteTotalTimeoutMultiplier = 100;

но результат все равно никакой smile
PM MAIL   Вверх
Бугемот
Дата 12.1.2006, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Все, со всем разобрался. SMS не мог отправить потому что у моего телефона какой-то нестандартный режим отсылки сообщений smile Во всех доках написано по-другому, когда уже начал экспериментировать - наткнулся. Вобщем, все работает всем большое спасибо!
Остался один вопрос: я отсылаю команду и мне надо дождаться отклика, как его ждать? Я сейчас поставил sleep, т.е. просто тупо жду какое-то время, т.к. после отправки в порт команды отклик приходит с задержкой. А как правильно будет его получать, как отслеживать эту задержку? Ждать какое-то время до получения этого символа, но не больше определенного промежутка?

PM MAIL   Вверх
Dreamer_0x01
Дата 12.1.2006, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


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

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



Таймауты на то и созданы, чтобы грамотно ждать отклика. Но если уж не хочется переделывать - лучше не Sleep использовать, так ты поток усыпляешь намертво, а это не есть хорошо, лучше в цикле делай ReadFile, пока не прочитает то, что тебе нужно, либо пока не кончется установленное тобой количество попыток чтения. (оно соответственно будет равно твоему нужному времени, деленному на твой таймаут, установленный для чтения. )

Но вообще...Не понимаю, чем же тебе не понравились установки вида

Код

    COMMTIMEOUTS ctm;
//....................
    ctm.ReadIntervalTimeout=0;
    ctm.ReadTotalTimeoutConstant=ТВОЙ_TIMEOUT;//в миллисекундах
    ctm.ReadTotalTimeoutMultiplier=0;
    SetCommTimeouts(ТВОЙ_ХЕНДЛ,&ctm);


И усе, никаких проблем!
Устанавливаешь вместо ТВОЙ_TIMEOUT твое время, в течение которого нужно ждать приема, и все!
Функция ReadFile будет ждать приема указанного тобой количества символов в течение времени ТВОЙ_TIMEOUT (в миллисекундах). Очень удобно!




--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Бугемот
Дата 12.1.2006, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



ctm.ReadTotalTimeoutConstant=ТВОЙ_TIMEOUT; - влияет на все операции чтения.
А отклик мне надо ждать только на команду перед записью, поэтому тормозить все чтение общим тайм-аутом не очень хочется. У меня сейчас стоит межсимвольный - 2мс, но 5Кб считываются не 10 секунд, а меньше. Если выставить межсимвольный в 0, а Constant'ный - например в 100, то чтение визуально выполняется быстрее. Поэтому я им не воспользовался константным. Sleep мне тоже не нравится smile
О, проверил сейчас константный - работает! Осталось один нюанс уточнить - сколько же ждать smile
Большое спасибо!
Добавлено @ 18:36
Причем если выставить константу заведомо больше, чем надо. То и ожидание будет длиться все это время, хотя данные уже точно пришли в порт smile
Добавлено @ 18:37
Вобщем, или это не так уж удобно, или я чего-то не понимаю smile
PM MAIL   Вверх
Бугемот
Дата 12.1.2006, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Проверил только что: если перед моей командой на запись (сначала команда, жду отклик, запись) отправить какую-нибудь другую - все, отклика с таймаутом в 100мс я дождусь. Если же сразу после открытия отправить эту команду - не дожидаюсь, т.е. отклик не приходит, ну и как тут быть smile
PM MAIL   Вверх
Dreamer_0x01
Дата 12.1.2006, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


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

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



Цитата(Бугемот @ 12.1.2006, 18:36 Найти цитируемый пост)

А отклик мне надо ждать только на команду перед записью, поэтому тормозить все чтение общим тайм-аутом не очень хочется

А менять таймауты в процессе работы не пробовал? smile


Цитата(Бугемот @ 12.1.2006, 18:36 Найти цитируемый пост)

Причем если выставить константу заведомо больше, чем надо. То и ожидание будет длиться все это время, хотя данные уже точно пришли в порт


1. А откуда ты знаешь, что данные пришли?
2. Поверь, у меня это все работает, ведь это моя работа, и с ожиданием все в порядке, как только в приемном буфере порта накопится нужное количество символов, ожидание прекращается.
3. Ты случаем не в дебаггере это смотришь? ;)



--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Бугемот
Дата 12.1.2006, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Dreamer_0x01 @ 12.1.2006, 19:29 Найти цитируемый пост)

А менять таймауты в процессе работы не пробовал?

Если честно - нет, такое практикуется вообще? У меня раз в 15 секунд из порта принимаются данные. Теперь проблема - в записи.
Цитата(Dreamer_0x01 @ 12.1.2006, 19:29 Найти цитируемый пост)

3. Ты случаем не в дебаггере это смотришь? ;)

нет smile этот совет я уже проверил - в дебаггере не работает корректно smile
Т.е. рекомендуете для команд записи выставлять таймаут на чтение - больше чем на обычное чтение? Т.е. отправляется запрос на передачу данных (вот тут я и жду отклика), и в данном случае - изменить время ожидания?
PM MAIL   Вверх
Бугемот
Дата 13.1.2006, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Всем еще раз здравствуйте. Никак не могу получить нормально отклик. ВОт код:

Код

CString CSMSDoc::SendSMS(CString csDA, CString csText)
{
    COMMTIMEOUTS ctCurrent = CSMSCOMPort::Instance()->GetCommSettings();
    ctCurrent.ReadTotalTimeoutMultiplier = 1; 
    ctCurrent.ReadTotalTimeoutConstant = 3000; // таймаута в 3 секунды 100% должно хватить для получения отклика
    CSMSCOMPort::Instance()->SetCommSettings(ctCurrent); // устанавилваю новые таймауты

    // Выполняем отправку
    CString cscommand, csresult;
    cscommand.Format("AT+CMGS=%d\r", icommand_length);

    BOOL bresult = FALSE;
    CSMSCOMPort::Instance()->ClearPort();
    DWORD dwcommand_length = cscommand.GetLength();
    DWORD dwwritten_bytes = 0;
    bresult = CSMSCOMPort::Instance()->WritePort(cscommand, dwcommand_length, dwwritten_bytes);
    if(dwwritten_bytes == 0 || !bresult)
        return ("\r\nError write SMS-send command");

    char buffer[50]; // Должен прийти отклик в виде символа >
    DWORD dwnumber_to_read_bytes = 50;
    DWORD dwnumber_read_bytes = 1;
    bresult = TRUE;
    memset(buffer, 0, sizeof(buffer));
    while(dwnumber_read_bytes != 0)
        bresult = CSMSCOMPort::Instance()->ReadPort(buffer, dwnumber_to_read_bytes, dwnumber_read_bytes);
    for(DWORD i = 0; i < dwnumber_read_bytes; i++)
        csresult += buffer[i];
    return csresult;
}

Вот, собственно, и все. Отклика я не дождался smile
Чего-то я не понимаю smile
PM MAIL   Вверх
Dreamer_0x01
Дата 13.1.2006, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


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

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



Цитата(Бугемот @ 12.1.2006, 20:12 Найти цитируемый пост)

Т.е. рекомендуете для команд записи выставлять таймаут на чтение - больше чем на обычное чтение?


Зачем вообще выставлять таймаут на запись? Я все таймауты, начинающиеся со слова Write, присвоил нулю, и все прекрасно работает.

Код

while(dwnumber_read_bytes != 0)    
        bresult = CSMSCOMPort::Instance()->ReadPort(buffer, dwnumber_to_read_bytes, dwnumber_read_bytes);


Может быть, ты хотел сделать так:
Код

while(dwnumber_read_bytes == 0)
//......


? smile


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

unsigned short nPopitok=1000;
while((dwnumber_read_bytes == 0)&&(nPopitok))
{    
        bresult = CSMSCOMPort::Instance()->ReadPort(buffer, dwnumber_to_read_bytes, dwnumber_read_bytes);
nPopitok--;
}
if(!nPopitok)
{
//Например, вот так:
AfxMessageBox(_T("Количество попыток чтения исчерпалось"));
}


Вот так ты свою программу не завесишь.

Впрочем, это так, лирическое отступление, поделился печальным опытом, так сказать ;)
А еще...Ты параметр dwnumber_read_bytes в функцию CSMSCOMPort::Instance()->ReadPort как передаешь?
В фунции что у тебя принимается - сам параметр, или указатель, или ссылка, с этим усе в порядке? ;)

Это сообщение отредактировал(а) Dreamer_0x01 - 13.1.2006, 16:45


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Бугемот
Дата 13.1.2006, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



"Количество попыток" - а зачем же тогда таймаут на чтение ??? Разве смысл не один и тот же - в течение какого-то времени опрашивать порт?
Цитата(Dreamer_0x01 @ 13.1.2006, 16:39 Найти цитируемый пост)

В фунции что у тебя принимается - сам параметр, или указатель, или ссылка, с этим усе в порядке? ;)
- передается ссылка, с этим все в порядке smile
Проблема в том, что я не могу получить отклик, хотя таймаут на чтение выставлен заведомо бОльший. Зато через некоторое время, после отпарвки какой-нибудь "левой" команды - получаю отклик smile
PM MAIL   Вверх
Страницы: (4) Все 1 2 [3] 4 
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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