输出AT命令c ++代码

时间:2013-05-21 06:53:49

标签: c++ gsm at-command

我写了下面的代码,用GSM SM5100B向我的手机发送一条简单的信息。但它不起作用。我想用c ++代码检查每个printf行的输出。 例如

AT+CMFG=1
ok
AT+CMGS="69******"
ok

等。 有没有为什么要实现这个?

我的代码

#include <stdio.h> // standard input / output functions
#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 definitionss
#include <time.h>   // time calls

int open_port(void)
{
int fd; // file description for the serial port
fd = open("/dev/ttyAMA0", O_RDWR | O_NOCTTY | O_NDELAY);
if(fd == -1) // if open is unsucessful
{
    printf("open_port: Unable to open /dev/ttyAMA0. \n");
}
else
{
    fcntl(fd, F_SETFL, 0);
    printf("port is open.\n");
}

return(fd);
} //open_port

int configure_port(int fd)      // configure the port
{
struct termios port_settings;      // structure to store the port settings in

cfsetispeed(&port_settings, B9600);    // set baud rates
cfsetospeed(&port_settings, B9600);

port_settings.c_cflag &= ~PARENB;    // set no parity, stop bits, data bits
port_settings.c_cflag &= ~CSTOPB;
port_settings.c_cflag &= ~CSIZE;
port_settings.c_cflag |= CS8;

tcsetattr(fd, TCSANOW, &port_settings);    // apply the settings to the port
return(fd);

}  

void init_gsm()
{
 printf("AT+CMGF=1\r\n");
 sleep(3);
 printf("AT+CMGS=\"+34603****\"\r\n");
 sleep(3);
 //printf("Hello\r\n%c",26); 
 printf("Hello\x1A");
 sleep(3);
// printf("\x1A");

}
int main(void)
{
int fd = open_port();
configure_port(fd);
sleep(5);
//query_modem(fd);
    init_gsm();
return(0);

}

2 个答案:

答案 0 :(得分:0)

C ++方法是您使用stringstreamwrite的组合。

stringstream ss;
string number;

cout << "Enter phone number to send to:");  
cout.flush();
cin >> number;
ss << "AT+CMGS=\"" << number << "\"\r\n";
string str = ss.str();
write(fd, str.c_str(), str.length());

答案 1 :(得分:0)

最严重的是,在发送AT命令后,您不会等待最终结果代码。使用sleep不是有效的解决方案。您必须修复此问题以正确解析您从调制解调器返回的响应。有关详细信息,请参阅以下答案,answer 1answer 2

然后你的init_gsm函数应该有一个int fd参数用于发送AT命令以及从中读取响应。