C++ 为什么我的GSM调制解调器中有AT命令回音?

C++ 为什么我的GSM调制解调器中有AT命令回音?,c++,gsm,at-command,C++,Gsm,At Command,我有一个GSM调制解调器和测试它的腻子。它起作用了。然后我用C++程序发送,但调制解调器答复。它只是响应我的命令,没有回答OK。 这是我的代码: #include <QCoreApplication> #include <stdio.h> #include <string.h> #include <unistd.h> #include <fcntl.h> #include <errno.h> #include <ter

我有一个GSM调制解调器和测试它的腻子。它起作用了。然后我用C++程序发送,但调制解调器答复。它只是响应我的命令,没有回答OK。
这是我的代码:

#include <QCoreApplication>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <termios.h>
#include <iostream>
int fd;
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);
tcsetattr(fd,TCSANOW,&options);
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);
}
void writeport1(void)
{
    char w[]="AT\r\n";

    //std::cout << strlen(w);
    //std::cout << w;

    write(fd,w,sizeof(w));
}



int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    int aa ;
    char i[10];
    aa=openport();
    if (aa==1)
    {
        configport();
        writeport1();
        printf("start reading ..... \n");
        aa=read(fd,i,sizeof(i));
        i[aa]=0;//terminate the string
        //std::cout << i << std::endl;
        printf("finish reading ..... \n");

    }

    closeport();
    return a.exec();
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int-fd;
int openport(无效)
{
fd=开放(“/dev/ttyUSB0”,O|RDWR | O|NOCTTY | O|NDELAY);
如果(fd==-1)
{
perror(“打开_端口:无法打开端口/dev/ttyUSB0\n”);
返回-1;
}
其他的
{
printf(“open_port:successfully open port/dev/ttyUSB0\n”);
fcntl(fd,F_SETFL,0);
返回1;
}
}
无效关闭端口(无效)
{
关闭(fd);
}
void配置端口(void)
{
结构termios选项;
tcgetattr(fd和选项);
cfsetispeed(和选项,B9600);
cfsetospeed(和选项,B9600);
选项c|u cflag |=(CLOCAL | CREAD);
tcsetattr(fd、TCSANOW和选项);
options.c_cflag&=~CSIZE;
选项c|u cflag |=CS8;
options.c_cflag&=~PARENB;
options.c_cflag&=~CSTOPB;
options.c_cflag&=~CSIZE;
选项c|u cflag |=CS8;
选项c|u iflag&=~(IXON | IXOFF | IXANY);
}
void writeport 1(void)
{
字符w[]=“AT\r\n”;

//std::cout您尚未终止字符串
w
,因此当
write
调用正常时,将其传递给
cout
时会出现未定义的行为-更改:

char w[4];
w[0]=65;
w[1]=84;
w[2]=13;
w[3]=10;
//sprintf(i,"2f9",k);
std::cout << w;
write(fd1,w,sizeof(w));
charw[4];
w[0]=65;
w[1]=84;
w[2]=13;
w[3]=10;
//sprintf(i,“2f9”,k);

std::cout调制解调器回复
OK
、尝试等待一段时间然后读取或将读取放入循环中需要时间。

默认情况下,GSM模块返回与GSM调制解调器中的回声相同的“AT”命令。因此,您可以通过发送命令“ATE0”来关闭回声并通过发送命令“AT&W”和“OK”将设置保存到永久存储器中。
如果需要,您可以通过再次发送命令“ATE1”来重新启用回显功能。

谢谢我的朋友。但在更改代码后,它仍然不起作用:(您可能有多个错误,但至少修复了其中一个错误。请注意,大多数调制解调器默认回显命令,因此如果您发送“at”,您将获得“at”回显,后跟“OK”。回显命令可能会混淆控制台,因此关闭命令回显。AT命令为ATE0。然后,当我在putty中测试时,回显关闭,调制解调器立即回复我OK。我将睡眠(5),但没有任何变化。找到一些工具可以让您准确地看到通过串行端口传输的字节,这可能会很有用。我有一个硬件设备,可以与串行电缆连接并捕获数据,并且有一个软件可以让您在数据通过串行端口驱动程序时看到数据。查看实际情况在线数据对于此类故障的排除非常有用。您可能会看到程序中的字节与预期不符,或者“OK”真的回来了,就像其他人所说的可能发生的那样晚。如何使用串行端口查看字节传输?我想这是我的问题。(我的意思是,我发送的数据可能有问题)。当我用pc向调制解调器发送AT时,它会立即回答OK。这是来自同一用户的重复问题:我会概括答案。大多数(如果不是所有)终端在回答之前都会回显。这样,您可以控制您发送的命令是否已收到(想象一下连接不稳定的远程termanal)。可以在远程端(通过发送正确的命令-请参阅设备手册)或本地端抑制回音。最后,您可以跳过刚才发送的相同字节数来忽略回音。
char w[5];
w[0]='A';
w[1]='T';
w[2]=13;
w[3]=10;
w[4]=0;                  // <<<
//sprintf(i,"2f9",k);
std::cout << w;
write(fd1,w,strlen(w));  // <<<
char w[] = "AT\r\n"
std::cout << w;
write(fd1,w,strlen(w));