Невозможно отправить SMS с помощью AT-команд

Пожалуйста, будьте любезны взглянуть на следующий код. я использую QextSerialPort для доступа к портам

#include <qstring.h>
#include <qdebug.h>
#include <QCoreApplication>int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);

QList<QextPortInfo> ports = QextSerialEnumerator::getPorts();
QextSerialPort *port;
QString portName;

int counter=0;

//Navigate through ports untill you find huwawei USB dongle
while(counter<ports.size())
{
portName = ports[counter].portName;
QString productId= ports[counter].productID;
QString physicalName = ports[counter].physName;
QString vendorId = ports[counter].vendorID;
QString friendName = ports[counter].friendName;string convertedPortName = portName.toLocal8Bit().constData();
string convertedProductId = productId.toLocal8Bit().constData();
string convertedPhysicalName = physicalName.toLocal8Bit().constData();
string convertedVendorId = vendorId.toLocal8Bit().constData();
string convertedFriendName = friendName.toLocal8Bit().constData();

cout << "Port Name: " << convertedPortName << endl;
cout << "Product ID:" << convertedProductId << endl;
cout << "Physical Name: " << convertedPhysicalName << endl;
cout << "Vendor Id: " << convertedVendorId << endl;
cout << "Friend Name: " << convertedFriendName << endl;
cout << endl;
counter++;//Break if you found Huwawei USB dongle, assign the port to a new port

if (std::string::npos != convertedFriendName.find("HUAWEI Mobile Connect - 3G Modem"))
{
std::cout << "found!" << std::endl;
port = new QextSerialPort(portName);
break;
}
}//Write and send the SMS
port->open(QIODevice::ReadWrite) ;
cout << port->isOpen() << endl;
port->write("AT+CFUN=1");
port->write("AT+CMGF=1 ");
port->write("AT+CMGS=1234567");
port->write("Hello Test SMS");
//port->write("0x1A");
port->flush();

port->close();
cout << port->isOpen() << endl;

system("pause");
return 0;

}

В этом коде я пытаюсь отправить SMS с помощью AT-команд. Мой ключ — это USB-ключ Huwawei. Во всяком случае, он называется «Модем MegaFone».

В моем коде я не могу отправить SMS на самом деле. Это почему? Обратите внимание, что вам нужно изменить номер телефона при запуске этого кода. Обратите внимание, что я новичок в QT, USB-программировании и AT-командах. Я даже не знаю, получаю ли я доступ к правильному порту, потому что есть 3 порта, принадлежащие huwawei. Мой вывод следующий.

Пожалуйста, помогите мне правильно отправить смс.

введите описание изображения здесь

ОБНОВИТЬ

#include <qstring.h>
#include <qdebug.h>
#include <QCoreApplication>int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);

QList<QextPortInfo> ports = QextSerialEnumerator::getPorts();
QextSerialPort *port;
QString portName;

int counter=0;

//Navigate through ports untill you find huwawei USB dongle
while(counter<ports.size())
{
portName = ports[counter].portName;
QString productId= ports[counter].productID;
QString physicalName = ports[counter].physName;
QString vendorId = ports[counter].vendorID;
QString friendName = ports[counter].friendName;string convertedPortName = portName.toLocal8Bit().constData();
string convertedProductId = productId.toLocal8Bit().constData();
string convertedPhysicalName = physicalName.toLocal8Bit().constData();
string convertedVendorId = vendorId.toLocal8Bit().constData();
string convertedFriendName = friendName.toLocal8Bit().constData();

cout << "Port Name: " << convertedPortName << endl;
cout << "Product ID:" << convertedProductId << endl;
cout << "Physical Name: " << convertedPhysicalName << endl;
cout << "Vendor Id: " << convertedVendorId << endl;
cout << "Friend Name: " << convertedFriendName << endl;
cout << endl;
counter++;//Break if you found Huwawei USB dongle, assign the port to a new port

if (std::string::npos != convertedFriendName.find("HUAWEI Mobile Connect - 3G Modem"))
{
std::cout << "found!" << std::endl;
port = new QextSerialPort(portName);
break;
}
}//Write and send the SMS
port->open(QIODevice::ReadWrite) ;
cout << port->isOpen() << endl;
port->write("AT+CFUN=1\n");
cout << "\n";
port->write("AT+CMGF=1 \n ");
cout << "\n";
port->write("AT+CMGS=0776255495\n");
cout << "\n";
port->write("Hello Test SMS\n");
cout << "\n";
//port->write("0x1A");
port->flush();

port->close();
cout << port->isOpen() << endl;

system("pause");
return 0;

}

1

Решение

Ваша проблема заключается в следующем:

port->write("AT+CFUN=1");
port->write("AT+CMGF=1 ");
port->write("AT+CMGS=1234567");
port->write("Hello Test SMS");

Всегда после отправки командной строки AT на модем вы ДОЛЖЕН дождитесь окончательного кода результата (например, обычно OKили же ERROR хотя есть еще несколько, и вы должны быть готовы справиться со всеми из них. Для примера того, как ждать окончательных кодов результата, вы можете посмотреть на исходный код atinout, это крошечная программа для чтения списка команд AT, отправки их на модем и распечатки ответов).

Потому что без ожидания следующая команда прервет текущую команду. Прерывание AT-команд определено в разделе «5.6.1 Прерывание команд» в V.250. Если у вас мало опыта работы с AT-командами, эту спецификацию необходимо прочитать. Кроме того, вы бы хорошо прочитали 27.005 для команд + CMG …, которые вы используете. Вы найдете ссылки на спецификации на информация тега по команде.

За AT+CMGS в частности, вы должны также дождаться «\ r \ n>» перед отправкой текста, см. мой другой ответр.

2

Другие решения

Других решений пока нет …