Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Motorola C650 как usb modem, Не отвечает на АТ команды 
V
    Опции темы
urinderiar
Дата 27.5.2006, 01:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Всем привет. 
Есть следующая проблема.
Под FreeBSD 5.3 телефон Mot C650 работая в режиме модема не отвечает на АТ команды. Пытаюсь послать "AT"(для примера), должен ответить "OK", ответа жду по select. Результат - молчание.
Вот тестовый код:
Код

#include <fcntl.h>
#include <stdio.h>
#include <termios.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <unistd.h>

void init_umodem(int fd);

int main() {
   int fd, fd_rd;
   char buf[12] = "AT";
   fd_set fds;
   struct timeval timeout;
   timeout.tv_sec = 0;
   timeout.tv_usec = 100000;

   if((fd = open("/dev/ucom0", O_RDWR | O_NOCTTY | O_NONBLOCK)) == -1) {
      perror("Error open");
      return -1;
   }

   init_umodem(fd);

   write(fd, buf, strlen(buf));

   FD_ZERO(&fds);
   FD_SET(fd, &fds);

   if((fd_rd = select(fd+1, &fds, NULL, NULL, &timeout)) == -1) {
      perror("Error select");
      return -1;
   }

   if(fd_rd == 0) {
      fprintf(stderr, "Timeout\n");
      return 0;
   }

   read(fd, buf, 2);

   close(fd);

   return 0;
}

void init_umodem(int fd) {
   struct termios mtermios;
   speed_t mspeed = 115200;

   bzero(&mtermios, sizeof(mtermios));
   mtermios.c_cflag = CRTSCTS | CS8 | CLOCAL | CREAD | O_NDELAY;
   cfsetispeed(&mtermios, mspeed);

   mtermios.c_iflag = IGNPAR;
   mtermios.c_oflag = 0;
   mtermios.c_lflag = 0;
   mtermios.c_cc[VTIME] = 1;
   mtermios.c_cc[VMIN] = 0;
   tcflush(fd, TCIOFLUSH);
   tcsetattr(fd, TCSANOW, &mtermios);
   
   return;
}


Результат работы кода - выход по "таймауту".  

Это сообщение отредактировал(а) urinderiar - 27.5.2006, 01:56
PM MAIL   Вверх
bilbobagginz
Дата 29.5.2006, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

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



a вызовы   cfsetispeed(),  tcsetattr() - что возвращают ? нолик или чаво другое ?
пока.
 


--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
urinderiar
Дата 3.6.2006, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



bilbobagginz, 
cfsetispeed() возвращает ноль, а вот tcsetattr() возвращает -1, ошибка - "Invalid argument".
 
PM MAIL   Вверх
GrayCardinal
Дата 3.6.2006, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


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

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



На сколько я знаю команды модема, там
"\r\n" Должно быть в конце. Правда эт для комовских, но думаю в данном случае аналогично. Тупо нужен конец строки. Т.е.
"AT\r\n" (0x0D 0x0A в конец).

Да, и что за "AT", может все-таки "ATZ" ? 


--------------------
PM MAIL WWW   Вверх
urinderiar
Дата 4.6.2006, 01:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

bilbobagginz, 
cfsetispeed() возвращает ноль, а вот tcsetattr() возвращает -1, ошибка - "Invalid argument".

Здесь ступил - забыл вызвать cfsetospeed(). 
GrayCardinal, Попробовал отослать "AT\r\n", "ATZ\r\n" результат тот же. Таймаут.  

Это сообщение отредактировал(а) urinderiar - 4.6.2006, 01:44
PM MAIL   Вверх
GrayCardinal
Дата 4.6.2006, 05:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


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

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



У меня по тайм-ауту выходит только если модем не включен. Если включен, и "ATZ\r\n" - начинает пищать что готов. Правда возвращает он не "OK" а "ATZ\r\n" и второй раз подряд если запускать то уже не пикает. smile

Я через /dev/ttyS1 пробую ;) 


--------------------
PM MAIL WWW   Вверх
urinderiar
Дата 4.6.2006, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



GrayCardinal, Заработало, на "ATZ\r\n" возвращает "ATZ\r\n OK". Благодарю за помощь.
Код

#include <fcntl.h>
#include <stdio.h>
#include <termios.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <unistd.h>

void init_umodem(int fd);
int send_command(int fd, char *buf);

int main() {
   int fd;

   if((fd = open("/dev/ucom0", O_RDWR | O_NOCTTY | O_NONBLOCK)) == -1) {
      perror("Error open");
      return -1;
   }

   init_umodem(fd);
   send_command(fd, "ATZ\r\n");

   close(fd);
   return 0;
}

void init_umodem(int fd) {
   struct termios mtermios;
   int opt;

#define BAUDRATE B115200

   bzero(&mtermios, sizeof(mtermios));

   mtermios.c_cflag = CRTSCTS | CS8 | CLOCAL | CREAD | O_NDELAY;

   if(cfsetispeed(&mtermios, BAUDRATE) == -1) {
      perror("Error cfsetispeed");
      return;
   }
   if(cfsetospeed(&mtermios, BAUDRATE) == -1) {
      perror("Error cfsetospeed");
      return;
   }

   mtermios.c_iflag = IGNPAR;
   mtermios.c_oflag = 0;
   mtermios.c_lflag = 0;
   mtermios.c_cc[VTIME] = 0;
   mtermios.c_cc[VMIN] = 1;
   tcflush(fd, TCIOFLUSH);

   if(tcsetattr(fd, TCSANOW, &mtermios) == -1) {
         perror("Error tcsetattr");
         return;
   }
   return;
}

int send_command(int fd, char *command) {
   int fd_rd;
   char resp[255];
   fd_set fds;
   struct timeval timeout;
   timeout.tv_sec = 0;
   timeout.tv_usec = 500000;

   bzero(resp, sizeof(resp));

   if(write(fd, command, strlen(command)) == -1) {
      perror("Error write");
      return -1;
   }

    FD_ZERO(&fds);
    FD_SET(fd, &fds);

    if((fd_rd = select(fd+1, &fds, NULL, NULL, &timeout)) == -1) {
       perror("Error select");
       return -1;
    }

    if(fd_rd == 0) {
       fprintf(stderr, "Timeout\n");
       return 0;
    }

    if(read(fd, resp, 255) == -1) {
       perror("Error read");
       return -1;
    }

    printf("Responce: %s\n", resp);

    return 0;
}
                                                  
 
PM MAIL   Вверх
GrayCardinal
Дата 5.6.2006, 05:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


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

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



urinderiar, 
Да завсегда пожалуйста. 


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

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

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


 




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


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

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