Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сохранение файла из гаджетов 
:(
    Опции темы
vlarry
Дата 18.10.2013, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 16.8.2009

Репутация: нет
Всего: нет



Добрый день, форумчане. Потребовалась помощь по следующему вопросу. Есть устройство. которое подключено к компьютеру и передает данные по uart. Устройство управляется посредством АТ-команд. На устройство можно заливать скрипты на python и считывать эти скрипты на компьютер. Проблема в считывании скриптов с разрешением .pyo. Когда я считываю скрипты конфигурационных файлов, т.е. текстовых, то проблем нет, а вот скомпилированные никак не могу скачать, присылает часть и все, подтверждение ОК нет. В чем проблема не могу понять. Вот код:
Код

void CGPSTerminal::slotReadData()
{
    QByteArray data = QByteArray(m_port->readAll());
    QByteArray listData;
    QString strData = data;
    static QString strListData;

    switch(m_terminal.terminal_id)
    {
        case MAIN_TERMINAL:
            m_ui->m_teTerminal->insertPlainText(strData);
        break;

        case MODULE_TERMINAL:
            m_ui->m_lwListScriptModule->clear();
            m_ui->m_leCountFiles->clear();

            m_ui->m_teTerminal->insertPlainText(strData);

            if(strData.contains(QRegExp("OK\\r\\n$")))
            {
                strListData += strData;

                int pos = 0, count = 0;

                QRegExp regexp("\"([A-Za-z0-9]+\\.[A-Za-z0-9]+)\"");

                while((pos = regexp.indexIn(strListData, pos)) != -1)
                {
                    m_ui->m_lwListScriptModule->addItem(regexp.cap(1));
                    QString str = regexp.cap(1);
                    pos += regexp.matchedLength();
                    count++;
                }

                m_ui->m_leCountFiles->setText(QString::number(count));

                strListData = "";
                m_terminal.terminal_id = MAIN_TERMINAL;
            }
            else
            {
                strListData += strData;
            }
        break;

        case SCRIPT_TERMINAL:
            if(strData.contains(QRegExp("OK\\r\\n$")))
            {
                qDebug() << tr("OK!!!");
                strListData += strData;

                strListData.remove(QRegExp("(AT#RSCRIPT=[A-Za-z0-9]+\\.[A-Za-z]+)(\\r\\n)+<*"));
                strListData.remove(QRegExp("\\r\\nOK\\r\\n$"));

                listData = strListData.toLatin1();

                QFile file("q:/" + m_terminal.property);
                if(!file.open(QIODevice::WriteOnly))
                {
                    qDebug() << tr("Не удается сохранить файл");
                }

                qDebug() << strListData;

                QDataStream out(&file);
                out << listData;

                file.close();

                strListData = "";

                m_terminal.terminal_id = MAIN_TERMINAL;
            }
            else
            {
                strListData += strData;
            }
        break;
    }

   QScrollBar *bar = m_ui->m_teTerminal->verticalScrollBar();
   bar->setValue(bar->maximum());
}

PM MAIL   Вверх
bsa
Дата 18.10.2013, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



m_port - это что? Указатель на QSerialPort?
PM   Вверх
vlarry
Дата 18.10.2013, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 16.8.2009

Репутация: нет
Всего: нет



Да, совершенно верно. Извините, забыл указать.
PM MAIL   Вверх
Guinness
Дата 18.10.2013, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 21.6.2009
Где: Зеленоград

Репутация: 2
Всего: 10



А на передающей стороне ошибки быть не может?
case SCRIPT_TERMINAL - это, я так понимаю, для обработки скомпилированных файлов?
Попробуйте считанный Вами буфер записывать в файл. Сравните с исходным файлом .pyo.
PM MAIL   Вверх
vlarry
Дата 18.10.2013, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 16.8.2009

Репутация: нет
Всего: нет



нет, ошибок нет на передающей стороне. Шлет он когда как, то за раз весь файл, то частями, но в программе это предусмотренно. 
MAIN_TERMINAL - вывод информации в главное окно (QTextEdit)
MODULE_TERMINAL - вывод списка файлов (QListWidget)
SCRIPT_TERMINAL - парсинг и запись в файл
Сохранял в файл и сравнивал, но не совпадает...чаще всего он ничего не пишет, т.к. для записи я жду ОК...там два варианта ОК или ERROR. Если просто записывать в файл, то он запишет часть данных, т.к. данные приходят либо за один раз, либо кусками...

Это сообщение отредактировал(а) vlarry - 18.10.2013, 16:02
PM MAIL   Вверх
borisbn
Дата 18.10.2013, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



А не нужно ли, случаем, это устройство переводить в бинарный режим какой-нибудь АТ-командой ?
При работе с модемами, например, нужно.
Почитай доку.

Добавлено через 4 минуты и 23 секунды
Это раз.
Второе:
Цитата(vlarry @  18.10.2013,  15:16 Найти цитируемый пост)
QString strData = data;

QByteArray может содержать байт, равный нулю, а в QString такого быть не должно.
Запиши в файл содержимой QByteArray'я и сравни с тем, что должно быть


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
o2n3e
Дата 18.10.2013, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 19.8.2011

Репутация: -1
Всего: -5




Модератор: Сообщение скрыто.

PM MAIL   Вверх
vlarry
Дата 18.10.2013, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 16.8.2009

Репутация: нет
Всего: нет



переделал case SCRIPT_TERMINAL на следующее:
Код

QFile file("q:/" + m_terminal.property);
        if(!file.open(QIODevice::WriteOnly))
        {
            qDebug() << tr("Не удается сохранить файл");
        }

        qDebug() << strListData;

        QDataStream out(&file);
        out << data;

        file.close();

Записало в файл конец файла в размере 500 байт из 2Kб. Вообще эти конвертации с QString и QByteArray делаются только для того, чтобы можно было парсить принятые данные регулярками:
Код

                strListData.remove(QRegExp("(AT#RSCRIPT=[A-Za-z0-9]+\\.[A-Za-z]+)(\\r\\n)+<*"));
                strListData.remove(QRegExp("\\r\\nOK\\r\\n$"));

в ручную не хочется убирать эти заголовки. И еще вопрос: как избавиться от 4 лишних байт при считывании в QByteArray? 
PM MAIL   Вверх
bsa
Дата 18.10.2013, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



vlarry, во-первых, как ранее было указано, readAll() не прочтет тебе все данные. Он лишь прочтет то, что успело придти к этому моменту времени.
во-вторых, я бы не делал конвертацию к qstring здесь вообще. Как минимум, из-за того, что может придти следующий блок, в котором текста нет вообще. Я бы делал парсинг для того момента, когда ты УВЕРЕН что идут строки. Например, до последнего "OK".
в-третьих, конвертацию из QByteArray лучше делать явно через fromLatin1(). Потому что конструктор делает предположение, что у тебя данные в utf8.
PM   Вверх
Guinness
Дата 18.10.2013, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 21.6.2009
Где: Зеленоград

Репутация: 2
Всего: 10



Цитата(bsa @  18.10.2013,  17:45 Найти цитируемый пост)
в-третьих, конвертацию из QByteArray лучше делать явно через fromLatin1(). Потому что конструктор делает предположение, что у тебя данные в utf8.

Лучше тогда так fromUtf8()
PM MAIL   Вверх
vlarry
Дата 18.10.2013, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 16.8.2009

Репутация: нет
Всего: нет



так при считывании скрипта к нему добавляется в начало заголовок, н-р при считывании файла script.pyo добавляется следующее:
AT#RSCRIPT=script.pyo
<<<
вот поэтому я этот заголовок и удаляю...И все же как убрать 4 байта, который добавляет QByteArray?
PM MAIL   Вверх
o2n3e
Дата 18.10.2013, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 19.8.2011

Репутация: -1
Всего: -5




Модератор: Сообщение скрыто.

PM MAIL   Вверх
vlarry
Дата 18.10.2013, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 16.8.2009

Репутация: нет
Всего: нет



это не я создавал устройство, а его производитель...это модуль telit GE863-GPS. Так что я только в данном случае просто работаю с этим устройством. Когда я разрабатываю свое устройство, то я и пишу под себя протокол...а здесь приходится пользоваться тем, что есть.
PM MAIL   Вверх
borisbn
Дата 18.10.2013, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Цитата(vlarry @  18.10.2013,  16:57 Найти цитируемый пост)
.И все же как убрать 4 байта, который добавляет QByteArray? 

Эти четыре байта добавляет не QByteArray, а QDataStream. Реализуй запись без него. У QFile есть метод write, принимающий QByteArray. Кстати, и писанины будет меньше ))


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
o2n3e
Дата 18.10.2013, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 19.8.2011

Репутация: -1
Всего: -5




Модератор: Сообщение скрыто.

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0881 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.