Посылка 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;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.