Hi every one. I have mini2440 and GSM modem that they connected to each other with USB serial port (ttyUSB0). this is my code in c++ to send AT: //--------------------------------------------------------------- #include <QCoreApplication> #include <stdio.h> /* Standard input/output definitions */ #include <string.h> /* String function definitions */ #include <unistd.h> /* UNIX standard function definitions */ #include <fcntl.h> /* File control definitions */ #include <errno.h> /* Error number definitions */ #include <termios.h> /* POSIX terminal control definitions */ #include <string> /*To use string type*/ #include <iostream> #include <string> using namespace std; // Definations int fd; /* File descriptor for the port */ string wr; int rd; char buffer[100]; /* Input buffer */ int openport(void); void closeport(void); void configport(void); string WriteRead(void); //------------------------------------- int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); openport(); if(fd>-1) { configport(); string str=WriteRead(); qDebug(str.c_str()); } return a.exec(); } //------------------------------------- int openport(void) { fd=open("/dev/ttyUSB0",O_RDWR|O_NOCTTY|O_NDELAY); if (fd==-1) { perror("open_port: unable to open port /dev/ttyUSB0\n"); return -1; } else { printf("open_port: succesfully open port /dev/ttyUSB0\n"); fcntl(fd,F_SETFL,0); return 1; } } //------------------------------------- void closeport(void) { close(fd); } //------------------------------------- void configport(void) { struct termios options; tcgetattr(fd,&options); cfsetispeed(&options,B9600); cfsetospeed(&options,B9600); options.c_cflag |= (CLOCAL | CREAD); options.c_cflag &= ~CSIZE; options.c_cflag |= CS8; options.c_cflag &= ~ PARENB; options.c_cflag &= ~CSTOPB; options.c_cflag &= ~CSIZE; options.c_cflag |= CS8; options.c_iflag &= ~(IXON|IXOFF|IXANY); tcsetattr(fd,TCSANOW,&options); } //------------------------------------ string WriteRead(void) { char buffer[255]; /* Input buffer */ char *bufptr; /* Current char in buffer */ int nbytes; /* Number of bytes read */ int tries; /* Number of tries so far */ for (tries = 0; tries < 3; tries ++) { if (write(fd, "AT\r", 3) < 3)// send an AT command followed by a CR continue; // read characters into our string buffer until we get a CR or NL bufptr = buffer; while ((nbytes = read(fd, bufptr, buffer + sizeof(buffer) - bufptr - 1)) > 0) { bufptr += nbytes; if (bufptr[-1] == '\n' || bufptr[-1] == '\r') break; } /* nul terminate the string and see if we got an OK response */ *bufptr = '\0'; string s(buffer); if (s.find("OK")) { return s; } else return "not answer"; } } //-------------------------------------------------------------------- but after send AT i say if find "OK" set the buffer to string s. then write string s in output. but it just write AT. there is no OK
send AT command from mini2440
Hi I get my answer: my problem is in modem config . this is my new config: void configport(void) { struct termios tty; struct termios tty_old; memset (&tty, 0, sizeof tty); /* Error Handling */ if ( tcgetattr ( fd, &tty ) != 0 ) { std::cout << "Error " << errno << " from tcgetattr: " << strerror(errno) << std::endl; } /* Save old tty parameters */ tty_old = tty; /* Set Baud Rate */ cfsetospeed (&tty, (speed_t)B9600); cfsetispeed (&tty, (speed_t)B9600); /* Setting other Port Stuff */ tty.c_cflag &= ~PARENB; // Make 8n1 tty.c_cflag &= ~CSTOPB; tty.c_cflag &= ~CSIZE; tty.c_cflag |= CS8; tty.c_cflag &= ~CRTSCTS; // no flow control tty.c_cc[VMIN] =1;// 0; // read doesn't block tty.c_cc[VTIME] = 10;// 2 but befor it 5; // 0.5 seconds read timeout tty.c_cflag |= CREAD | CLOCAL; // turn on READ & ignore ctrl lines /* Make raw */ cfmakeraw(&tty); /* Flush Port, then applies attributes */ tcflush( fd, TCIFLUSH ); if ( tcsetattr ( fd, TCSANOW, &tty ) != 0) { std::cout << "Error " << errno << " from tcsetattr" << std::endl; } } -------------------------------------------------------------------- my problem is solved