【问题标题】:Why my AT command echo in my GSM modem?为什么我的 AT 命令在我的 GSM 调制解调器中回显?
【发布时间】:2020-04-15 17:09:51
【问题描述】:

我有一个 GSM 调制解调器并通过 putty 对其进行测试。有用。然后我用我的 c++ 程序发送 AT,但调制解调器回复 AT。它只是回应我的命令,没有回答 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();
}

输出是这样的:

打开端口 open_port:
成功打开端口 /dev/ttyUSB0 端口
[root@FriendlyARM /]#./SerialPort -qws
open_port: 成功打开端口 /dev/ttyUSB0
开始阅读.....

我的错误在哪里?

【问题讨论】:

  • 找到一些可以让您准确查看通过串行端口传输的字节的工具可能会很有用。我有一个硬件设备,可以与串行电缆串联并捕获数据,并且存在允许您在数据通过串行端口驱动程序时查看数据的软件。观察线上的实际数据对于解决此类问题非常有用。您可能会看到来自您的程序的字节与您期望的不太一样,或者“OK”真的回来了,就像其他人建议的那样迟到了。
  • 如何查看串口的字节传输?我认为这是我的问题。 (我的意思是我发送的数据可能有问题)。当我用我的电脑发送 AT 到我的调制解调器时,它立即回答 OK。
  • 同一用户的重复问题:stackoverflow.com/review/late-answers/25864958

标签: c++ gsm at-command


【解决方案1】:

您还没有终止字符串 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));

到:

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));

【讨论】:

  • 谢谢我的朋友。但是在更改代码之后。它仍然不起作用:(
  • 你可能有不止一个错误,但至少这修复了其中一个。请注意,大多数调制解调器默认回显命令,因此如果您发送“AT”,您将得到回显“AT”,然后是“OK”。
  • 回显命令会混淆控制台,因此请关闭命令回显。 AT 命令是 ATE0。然后回声关闭
【解决方案2】:

modem回复OK需要时间,尝试等待一段时间再读取,或者循环读取。

【讨论】:

  • 当我在 putty 中测试时,调制解调器立即回复我 OK。我放了 sleep(5),但没有任何改变。
【解决方案3】:

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

【讨论】:

  • 我会概括答案。大多数(如果不是全部)终端在回答之前都会回显。这样你就可以控制你发送的命令是否被接收(想想连接不稳定的远程终端)。回声可以在远程端(通过发送正确的命令 - 请参阅您的设备的手册)或在本地端抑制。最后,您可以通过跳过刚刚发送的相同字节数来忽略回显。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-06
相关资源
最近更新 更多