Посылка AT - команд в модем.
От: Victor Zuev Россия  
Дата: 12.05.03 14:04
Оценка:
Пытаюсь послать AT-команду в модем (U.S.Robotics внешний). Модем отвечает почему-то очень редко.
В то же время Конвертор RS232-RS485 всегда отвечает как и должен эхом.
Пробовал посылать AT-команды в Hyper Terminal'е — модем отвечает всегда!
Пожайлуста подскажите что я деляю неверно.
В форумах ответа не нашел.
Заранее спасибо за ответы.
Примерный код приведён ниже.
ЗЫ: TAPI не интересует.


#include "stdafx.h"
#include <stdlib.h>
#include "Windows.h"
#include "string"

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    DCB dcb;
    COMMTIMEOUTS timeouts;

    ZeroMemory(&dcb, sizeof(DCB));
    ZeroMemory(&timeouts, sizeof(COMMTIMEOUTS));

    dcb.DCBlength = sizeof(DCB);

    // Заполняем структуры
    if(BuildCommDCBAndTimeouts("baud=9600 parity=N data=8 stop=1 to=on", &dcb, &timeouts) == FALSE)
    {
        printf("Error: BuildCommDCBAndTimeouts() fail !");
        return -1;
    }

    // Есть подозрения на тамауты (пробовал разные, но не помогает)
    timeouts.ReadIntervalTimeout = 50;
    timeouts.ReadTotalTimeoutMultiplier = 50;
    timeouts.ReadTotalTimeoutConstant = 1000;
    timeouts.WriteTotalTimeoutMultiplier = 0;
    timeouts.WriteTotalTimeoutConstant = 100;

    HANDLE hPort = NULL;

    // Отркрываем порт
    hPort = CreateFile("COM1", GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if(hPort == INVALID_HANDLE_VALUE)
    {
        printf("Error: CreateFile() fail !");
        return -1;
    }

    // Настраиваем порт
    if(SetCommState(hPort, &dcb) == FALSE)
    {
        printf("Error: SetCommState() fail !");
        CloseHandle(hPort);
        return -1;
    }

    if(SetCommTimeouts(hPort, &timeouts) == FALSE)
    {
        printf("Error: SetCommTimeouts() fail !");
        CloseHandle(hPort);
        return -1;
    }

    // Очищаем буфер
    PurgeComm(hPort, PURGE_TXCLEAR | PURGE_RXCLEAR);

    // Пробовал ATZ, ATI4 ...
    char send[5] = "AT";
    send[2] = 0x0d; // Перевод строки 
    send[3] = 0x0a; //    и каретки
    send[4] = 0x00; // Конец строки

    DWORD l = 0; // Количество записанных байт

    // Пишем в порт
    if(WriteFile(hPort, (LPCVOID) send, (DWORD) strlen(send), &l, NULL) == FALSE || l != strlen(send))
    {
        printf("Error: WriteFile() fail !");
        CloseHandle(hPort);
        return -1;
    }
    else
        printf("String :\n%s\nhad been written to COM1\n", send);

    // Пробуем читать из порта (например по 1 байту и всё что есть). Хотелось бы получить 'OK'
    BOOL b = TRUE;
    string recv = "";
    char s[2] = "";
    int totalread = 0;

    while(b)
    {
        if(ReadFile(hPort, s, 1, &l, NULL) == TRUE && l != 0)
        {
            recv += s[0];
            totalread ++;
        }
        else
            b = FALSE;
    }
    
    printf("Read %d bytes from COM1 :\n%s", totalread, (char*) recv.c_str());
    CloseHandle(hPort);

    return 0;
}
Re: Посылка AT - команд в модем.
От: Максим Алексейкин Россия  
Дата: 12.05.03 16:13
Оценка:
таймаут на чтение убери совсем. тогда ReadFile будет возвращать управление без ожидания байта, если его нет в буфере.
ICQ #311116826
Re[2]: Посылка AT - команд в модем.
От: Victor Zuev Россия  
Дата: 13.05.03 10:58
Оценка:
Здравствуйте, Максим Алексейкин, Вы писали:

МА>таймаут на чтение убери совсем. тогда ReadFile будет возвращать управление без ожидания байта, если его нет в буфере.


Много эксперементировал с таймаутами, но не очень помогло. Если все таймауты на чтение установить в 0 (тамауты не используются),
то ReadFile ждет вечно (поток зависает, а если его убить то получим утечку памяти, но речь не о том ).
Если-же тамауты достаточно малы, то возможно модем не успеет ответить и ReadFile прочитает 0 байт.

Всё таки, если дело в тамаутах подскажите какие значения следует поставить для модема.

Спасибо.
Re[3]: Посылка AT - команд в модем.
От: Максим Алексейкин Россия  
Дата: 13.05.03 14:39
Оценка:
Здравствуйте, Victor Zuev, Вы писали:

VZ>Здравствуйте, Максим Алексейкин, Вы писали:


МА>таймаут на чтение убери совсем. тогда ReadFile будет возвращать управление без ожидания байта, если его нет в буфере.


VZ>Много эксперементировал с таймаутами, но не очень помогло. Если все таймауты на чтение установить в 0 (тамауты не используются),

VZ>то ReadFile ждет вечно (поток зависает, а если его убить то получим утечку памяти, но речь не о том ).
VZ>Если-же тамауты достаточно малы, то возможно модем не успеет ответить и ReadFile прочитает 0 байт.

VZ>Всё таки, если дело в тамаутах подскажите какие значения следует поставить для модема.


VZ>Спасибо.


ну сделай работу с портом асинхронной. и реагируй на определённые события.
а на счёт таймаута, так скорость ты задаёшь 9600 Kbs. значит 9600 / 9 = 1066 Kbytes = 1092266 bytes в сек.
вот и расчитывай за сколько ответ придёт
ICQ #311116826
Re: Посылка AT - команд в модем.
От: Victor Zuev Россия  
Дата: 14.05.03 05:18
Оценка:
И вообще интересно как стандартный Hyper terminal пишет в COM-port?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.