Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Ввод/Вывод, Сеть. Межпроцессное взаимодействие _ Запись AT команд в виртуальный COM-порт

Автор: Lya_Inventor 24.5.2015, 10:00

Доброе утро!
Подскажите, пожалуйста, как правильно записать AT команду в порт? Использую библиотеку QSerialPort, но к сожалению команда в порт не уходит. Ошибок нет, т.к. возвращает 0 (No error occurred).

Прикладываю пример с записью команды
serial.write("AT+CMGF=1");
serial.write("QChar(13)");
serial.waitForBytesWritten(200);

Заранее благодарю за ответ.

Автор: lanz 24.5.2015, 14:46

А почему QChar(13) и почему в кавычках?

Автор: Lya_Inventor 24.5.2015, 15:35

Цитата(lanz @ 24.5.2015, 14:46) *
А почему QChar(13) и почему в кавычках?

QChar(13) код клавиши ENTER, необходимо вводить после установки режима работы и номера телефона. В кавычках записала, т.к. пробовала различные варианты ввода.

Автор: Lya_Inventor 24.5.2015, 18:11

С вопросом записи команды в порт разобралась. Скажите, пожалуйста, по какой причине serial1->waitForBytesWritten(200) возвращает false?

#include "comport1.h"
#include "ui_comport1.h"
#include <QtSerialPort/QtSerialPort>
#include <QDebug>
#include <QMainWindow>
QSerialPort *serial1;

comport1::comport1(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::comport1)
{
    ui->setupUi(this);
    serial1 = new QSerialPort(this);
    serial1->setPortName("COM66");
    serial1->open(QIODevice::ReadWrite);
    serial1->setBaudRate(QSerialPort::Baud9600);
    serial1->setDataBits(QSerialPort::Data8);
    serial1->setParity(QSerialPort::NoParity);
    serial1->setStopBits(QSerialPort::OneStop);
    serial1->setFlowControl(QSerialPort::NoFlowControl);

    if(serial1->isOpen()){

        serial1->write("AT+CMGF=1\r\n");
        serial1->waitForBytesWritten(200);
        serial1->write("AT+CMGS=\"+7**********\"\r\n");
        serial1->waitForBytesWritten(200);
        serial1->write("Hello""\x1A");
        
     }
}

Автор: lanz 24.5.2015, 19:05

Возможны два варианта,
1. Все байты записаны ДО вызова wait
2. Запись длится дольше 200 мс

Попробуйте убрать таймаут, и посмотрите что получится. Если все равно возвращает false, значит первый вариант.

Автор: Lya_Inventor 26.5.2015, 8:02

Цитата(lanz @ 24.5.2015, 19:05) *
Возможны два варианта,
1. Все байты записаны ДО вызова wait
2. Запись длится дольше 200 мс

Попробуйте убрать таймаут, и посмотрите что получится. Если все равно возвращает false, значит первый вариант.

Спасибо за помощь, удалось отправить сообщение.

Автор: Lya_Inventor 7.6.2015, 12:25

Здравствуйте!
Подскажите, пожалуйста, как корректно записать в порт номер телефона через переменную? (phone - переменная QString)
Пробовала записать следующим образом, но получаю ошибку no matching function for call to 'QSerialPort::write(const QString)'.
serial1->write("AT+CMGS=\"'%" +phone+ "%'\"\r");
Если вводить номер телефона, то всё проходит успешно.
serial1->write("AT+CMGS=\"+7**********\"\r")

Заранее благодарю.

Автор: lanz 8.6.2015, 9:26

Используйте метод .toLatin1()
У вас не получается, потому что нельзя передать в порт объект QString, потому что порт принимает байты, а строка содержит символы. Чтобы преобразовать строку в байты, нужно ее закодировать, используя некую кодировку.
Тут я немножко спекулирую и предполагаю, что ваше устройство понимает только Latin-1( http://en.wikipedia.org/wiki/ISO/IEC_8859-1 ), поэтому мы преобразовываем строку в массив байт, кодирующий эту строку - http://doc.qt.io/qt-4.8/qstring.html#toLatin1

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)