Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

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


Опытный
**


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

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



Что я хочу знать для начала: открыть выбранный порт, настроить его, послать АТ-команду в него, получить ответ, отобразить ответ.
Нашел поиском много всякого, начал разбираться, понял что для открытия порта и чтения\записи в\из него используются ф-ции CreateFile, WriteFile, ReadFile. Для настройки открытого порта используются ф-ции описанные в разделе MSDN - Communications Functions.
А вот чего не нашел пока - это как получить список доступных в системе COM-портов, дабы иметь возможность выбрать требуемый. Вариант "просто список из номеров по порядку" не подходит, у меня к примеру в системе 1 физический порт COM1 и 12 виртуальных, появившихся после установки Bluetooth-контроллера, которым программа установки присвоила номера от COM30 до СОМ42. Подскажите.
PM MAIL   Вверх
ama_kid
Дата 7.8.2011, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

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



HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
gromo
Дата 7.8.2011, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Я так понимаю, СОМ-порт нужен для работы с модемом или телефоном?!
Опиши конкретно задачу, какие функции нужны?
PM MAIL   Вверх
Dem_max
Дата 8.8.2011, 06:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

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





--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
AndreySol
Дата 9.8.2011, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Использовал вариант с QueryDosDevice, спасибо Всем.

Новый вопрос есть.
На виртуальном COM-порту - моб.телефон.
Пробую, для начала, открыть порт и послать в него AT-команду. Пример кода взял из статьи "Serial Communications in Win32" с MSDN. Приводить здесь код ф-ции открытия и настройки порта не буду, там ошибок не должно быть.
Ф-ция записи в порт:
Код
bool WriteBufferToPort(HANDLE hPortToWrite, char *lpBuffToWrite, DWORD dwToWrite)
{
    bool bResult = false;
    DWORD temp, dwRes, dwWritten;
/*
//очистить принимающий буфер порта
PurgeComm(hPortToWrite, PURGE_RXCLEAR);
*/
    //создать событие
    ovlapWrite.hEvent = CreateEvent(NULL, true, true, NULL);

    // записать буфер в порт
    if(!WriteFile(hPortToWrite, lpBuffToWrite, dwToWrite, &temp, &ovlapWrite))
    {
        if(GetLastError() != ERROR_IO_PENDING)
        {    // WriteFile failed, but isn't delayed. Report error and abort.
            bResult = false;
        }
        else
        {    // Write is pending.
            dwRes = WaitForSingleObject(ovlapWrite.hEvent, INFINITE);
            switch(dwRes)
            {    // OVERLAPPED structure's event has been signaled.
                case WAIT_OBJECT_0:
                    if(!GetOverlappedResult(hPortToWrite, &ovlapWrite, &dwWritten, FALSE))
                    {
                        bResult = false;
                    }
                    else
                    {    // Write operation completed successfully.
                        CString str;
                        str.Format("%u",dwWritten);
                        MessageBox(NULL,"WAIT_OBJECT_0",str,0);

                        bResult = true;
                    }
                break;
                
                default:
                    // An error has occurred in WaitForSingleObject.
                    // This usually indicates a problem with the
                    // OVERLAPPED structure's event handle.
                    bResult = false;
                break;
            }
        }
    }
    else
    { // WriteFile completed immediately.
        bResult = true;
    }

    return bResult;
}

вызов ф-ции:
Код
char szToWrite[] = "atdl"; // по этой команде МТ должен набирать посл. исходящий номер
if(WriteBufferToPort(hTestPort, szToWrite, strlen(szToWrite)) == true)
{

}

В результате получается так - вижу что порт открывается (МТ пишет на экране "SPP профиль подключен"), но команда не выполняется. Закрытие порта то-же нормально отрабатывается (МТ пишет на экране "SPP профиль отключен"). Где-то у меня ошибка, помогите.

Это сообщение отредактировал(а) AndreySol - 9.8.2011, 22:20
PM MAIL   Вверх
AndreySol
Дата 9.8.2011, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Нашел ошибку. Оказывается к AT-команде надо добавлять "\r".
PM MAIL   Вверх
AndreySol
Дата 27.8.2011, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



На виртуальном COM-порту - моб.телефон.
Посылаю команду, к примеру "at+egmr=0,0", ответ получаю в таком виде:
Цитата

a

t

+

e

g

m

r=0,0 +EGMR: "MT6223, E05"

OK

А HyperTerminal возвращает как положено, только
Цитата

+EGMR: "MT6223, E05"
OK

Уже и PurgeComm везде понаставил и пробовал порт открывать в синхронном и в асинхронном режиме - результат тот-же. В чем проблема может быть ?
PM MAIL   Вверх
AndreySol
Дата 27.8.2011, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Разобрался, был включен режим "Эхо", помогло ATE0 - и все стало приходить как надо.  

PM MAIL   Вверх
AndreySol
Дата 28.8.2011, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Посылаю команду AT+CPBR=2.
В своей программе ответ сохраняю в переменную типа CString, затем вывожу на RichEdit. Получается так
+CPBR: 2, "09xxxx6453", 129, ""
в последних кавычках должно быть имя абонента русскими буквами, с английским текстом все ОК. Проверял стандартным виндовым HyperTerminal'ом - в нем то-же "".
Подскажите, что можно сделать ?

P.S. смотрел команду +CSCS, но не очень понял что там за кодировки, кроме "PCCP437".
PM MAIL   Вверх
bass
Дата 1.9.2011, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



так создай мемо и туда побайтно выводи что приходит от телефона..... Либо телефон не чего не выдает либо софтина некорректно воспринимает (твоя).... 
PM MAIL   Вверх
AndreySol
Дата 3.9.2011, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

либо софтина некорректно воспринимает (твоя)....  

дак я не спорю. Вы подскажите, как корректно принять ?
PM MAIL   Вверх
Dem_max
Дата 4.9.2011, 05:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

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



не вижу функции приема данных


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
AndreySol
Дата 4.9.2011, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

не вижу функции приема данных 

Вы это имели ввиду ?
Код

#define BUFFSIZE 1024
unsigned char buffRead[BUFFSIZE];
...........

ReadFile(hCurrPort, buffRead, dwInQue, &temp, &ovlapRead);
CString strPrint = _T("");
strPrint.Format(_T("%s"), buffRead);

...........

m_Rich.SetWindowText(strPrint);


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


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

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



Ну наверное тебе лучше знать как ты данные пытаешься принять.


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
GremlinProg
Дата 5.9.2011, 06:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



Цитата(AndreySol @  4.9.2011,  14:46 Найти цитируемый пост)

Вы это имели ввиду ?
Код

#define BUFFSIZE 1024
unsigned char buffRead[BUFFSIZE];
...........

ReadFile(hCurrPort, buffRead, dwInQue, &temp, &ovlapRead);
CString strPrint = _T("");
strPrint.Format(_T("%s"), buffRead);

...........

m_Rich.SetWindowText(strPrint);


есть 3 варианта:
1. смотреть надо на результат, возвращаемый функцией ReadFile, только при значении TRUE buffRead будет содержать что-то вменяемое
2. hCurrPort открыт в режиме оверлаппед? тогда см. пункт 1., в таком случае чтение не обязано завершиться немедленно, т.е. нужен во первых, динамический (или статический) буфер, а во вторых - реализация какого-либо ожидания завершения операции чтения, в котором этот буфер можно использовать
3. если поставить на 6-й стоке брейкпойнт и посмотреть на содержимое buffRead, то если buffRead будет содержать данные, а на 8-й strPrint - уже нет, значит проблема в кодировке (ее нужно локализовать для России)



--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

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


 




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


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

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