Пытаюсь послать 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;
}