AT+CMGL="ALL" return OK

AT+CMGL="ALL" return OK only

我有 1 个 gsm 32 端口,名称是 xr21v1414 USB UART

我已经测试了另一个 AT COMMAND,它工作正常

在 USSD

但是如果我使用命令:

  serialPort.WriteLine("AT" + System.Environment.NewLine);
  Thread.Sleep(200);
  serialPort.WriteLine("AT+CMGF=1" + System.Environment.NewLine);
  Thread.Sleep(200);
  serialPort.WriteLine("AT+CMGL=\"ALL\"" + System.Environment.NewLine);
  Thread.Sleep(200);

回复

serialPort.ReadExisting();

为空(仅确定)

AT

OK
AT+CMGF=1

OK
AT+CMGL="ALL"
OK

但是如果我切换到另一个 gsm,命令工作正常。我有列表短信。

这是我的设置:

            SerialPort serialPort = new SerialPort();
            serialPort.PortName = m.ToString();
            serialPort.BaudRate = 115200;
            serialPort.DataBits = 8;
            serialPort.Handshake = Handshake.XOnXOff;
            serialPort.StopBits = StopBits.One;
            serialPort.Parity = Parity.None;
            serialPort.ReadTimeout = 20000;
            serialPort.WriteTimeout = 20000;
            serialPort.WriteBufferSize = 1024;
            serialPort.DtrEnable = true;
            serialPort.RtsEnable = true;

请问我该如何解决这个问题?

我很确定您得到的 OK 响应是因为您有 aborted the current command line by using Thread.Sleep(200) instead of reading and parsing 从调制解调器返回的响应,等待 最终结果代码 在发送下一个命令之前。

上面第一个链接的答案是一个问题,它的代码稍微差一点,因为它甚至没有睡眠,但即使有一个也是完全错误的。正如您不会编写忽略 HTTP 服务器发送给它的响应的 HTTP 客户端一样,您也不应该编写忽略调制解调器发送给它的响应的 AT 命令程序。

TL;DR 您 必须 将代码更改为 readparse 每个响应调制解调器发送给您的行,在发送下一个命令之前等待最终结果代码。有关详细信息,请参阅链接的答案。