crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Запись AT команд в виртуальный COM-порт
Lya_Inventor
  опции профиля:
сообщение 24.5.2015, 10:00
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 5
Регистрация: 24.5.2015
Пользователь №: 4388

Спасибо сказали: 0 раз(а)




Репутация:   0  


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

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

Заранее благодарю за ответ.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 24.5.2015, 14:46
Сообщение #2


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


А почему QChar(13) и почему в кавычках?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Lya_Inventor
  опции профиля:
сообщение 24.5.2015, 15:35
Сообщение #3


Новичок


Группа: Новичок
Сообщений: 5
Регистрация: 24.5.2015
Пользователь №: 4388

Спасибо сказали: 0 раз(а)




Репутация:   0  


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

QChar(13) код клавиши ENTER, необходимо вводить после установки режима работы и номера телефона. В кавычках записала, т.к. пробовала различные варианты ввода.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Lya_Inventor
  опции профиля:
сообщение 24.5.2015, 18:11
Сообщение #4


Новичок


Группа: Новичок
Сообщений: 5
Регистрация: 24.5.2015
Пользователь №: 4388

Спасибо сказали: 0 раз(а)




Репутация:   0  


С вопросом записи команды в порт разобралась. Скажите, пожалуйста, по какой причине 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
Сообщение #5


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


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

Попробуйте убрать таймаут, и посмотрите что получится. Если все равно возвращает false, значит первый вариант.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Lya_Inventor
  опции профиля:
сообщение 26.5.2015, 8:02
Сообщение #6


Новичок


Группа: Новичок
Сообщений: 5
Регистрация: 24.5.2015
Пользователь №: 4388

Спасибо сказали: 0 раз(а)




Репутация:   0  


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

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

Спасибо за помощь, удалось отправить сообщение.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Lya_Inventor
  опции профиля:
сообщение 7.6.2015, 12:25
Сообщение #7


Новичок


Группа: Новичок
Сообщений: 5
Регистрация: 24.5.2015
Пользователь №: 4388

Спасибо сказали: 0 раз(а)




Репутация:   0  


Здравствуйте!
Подскажите, пожалуйста, как корректно записать в порт номер телефона через переменную? (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
Сообщение #8


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


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

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 3.6.2020, 18:50