Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Motorola C650 как usb modem


Автор: urinderiar 27.5.2006, 01:54
Всем привет. 
Есть следующая проблема.
Под 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;
}


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

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

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

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

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

Автор: urinderiar 4.6.2006, 01:43
Цитата

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

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

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

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

Автор: urinderiar 4.6.2006, 14:39
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;
}
                                                  
 

Автор: GrayCardinal 5.6.2006, 05:16
urinderiar, 
Да завсегда пожалуйста. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)