Поиск:

Ответ в темуСоздание новой темы Создание опроса
> QCustomPlot и QByteArray, отображение данных на графике 
:(
    Опции темы
7BON
Дата 29.12.2015, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



math64 прописал вот так
запись
 
Код

void MainWindow::writeData()
{
    char datas[expectedFrameLength];
    serial->write(datas, expectedFrameLength);
    QBuffer buffers;
    buffers.setData(datas, expectedFrameLength);
    buffers.open(QIODevice::WriteOnly);
    QDataStream out(&buffers);

frame.header = 0xA0;
frame.command = 0x01;
frame.address = 0x0004;
frame.reserved[0] = 0;
frame.reserved[1] = 0;
frame.reserved[2] = 0;
frame.reserved[3] = 0;
frame.crc =  frame.header ^ frame.command ^ (frame.address & 0xFF) ^ ((frame.address >> 8) & 0xFF) ^
        frame.reserved[0] ^ frame.reserved[1] ^ frame.reserved[2];
for (int i = 0; i < sizeof(frame.reserved)/sizeof(frame.reserved[0]); i++)
   out <<  frame.header << frame.command << frame.address <<
           frame.reserved[i] << frame.crc;
ui->console->putData(data);
}

чтение
Код

void MainWindow::readData()
{


         char data[expectedFrameLength];
         serial->read(data, expectedFrameLength);
         QBuffer buffer;
         buffer.setData(data, expectedFrameLength);
         buffer.open(QIODevice::ReadOnly);
         QDataStream in(&buffer);

        frameread.header1 = 0xA5;
        frameread.command1 = 0x03;
        frameread.emkost = 0x00;
        frameread.address1 = 0x0004;
        frameread.zapros = 0x0004;
        frameread.crc1 = frameread.header1 ^ frameread.command1 ^ frameread.emkost^
                (frameread.address1 & 0xFF) ^ ((frameread.address1 >> 8) & 0xFF)^
                (frameread.zapros & 0xFF)^((frameread.zapros >> 8) & 0xFF);
        in >> frameread.header1 >> frameread.command1 >> frameread.emkost >>
                frameread.address1 >> frameread.zapros >> frameread.crc1;


    ui->console->putData(data);

}

посылку которую получаю совершенно другая (14 40 СЕ 6В 01 00 00 00), а нужно A5 01 00 04 00 00 00 CB к примеру, в чем может быть ошибка, что такая посылка идет? если прописать просто через QByteArray все получается.

На рисунке, если видно Simple terminal в консоли не понятные символы кодировку я пробывал прописывать, но ничего не вышло прописал я так
Код

        QTextCodec *codec = QTextCodec::codecForName("Windows-1250");
        QString string = codec->fromUnicode(data);
        qDebug() << string;

как можно это исправить?


Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
7BON
Дата 29.12.2015, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



вот картинка

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
math64
Дата 30.12.2015, 08:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Запись:
1. Зачем сначала передаёшь буфер, а затем заполняешь данными? Нужно наоборот.
2. Так у тебя все данные запишутся 3 раза:
Цитата(7BON @  29.12.2015,  14:34 Найти цитируемый пост)
Код

for (int i = 0; i < sizeof(frame.reserved)/sizeof(frame.reserved[0]); i++)
   out <<  frame.header << frame.command << frame.address <<
           frame.reserved[i] << frame.crc;


В цикле должно быть только    out << frame.reserved[i];
Чтение:
Здесь должно быть не заполнение frameread, а проверка, что прочитано правильно (и, естественно, после того, как прочитано):
Цитата(7BON @  29.12.2015,  14:34 Найти цитируемый пост)
Код

        frameread.header1 = 0xA5;
        frameread.command1 = 0x03;
        frameread.emkost = 0x00;
        frameread.address1 = 0x0004;
        frameread.zapros = 0x0004;
        frameread.crc1 = frameread.header1 ^ frameread.command1 ^ frameread.emkost^
                (frameread.address1 & 0xFF) ^ ((frameread.address1 >> 8) & 0xFF)^
                (frameread.zapros & 0xFF)^((frameread.zapros >> 8) & 0xFF);

При чтении можешь ингорировать все до получения 0xA5, и только после этого читать фрейм.
В принципе, можно не пользоваться QDataStream, а читать писать непосредственно в QByteArray

PM   Вверх
7BON
Дата 30.12.2015, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(math64 @  30.12.2015,  08:44 Найти цитируемый пост)


Чтение:
Здесь должно быть не заполнение frameread, а проверка, что прочитано правильно (и, естественно, после того, как прочитано):

При чтении можешь ингорировать все до получения 0xA5, и только после этого читать фрейм.
В принципе, можно не пользоваться QDataStream, а читать писать непосредственно в QByteArray
PS: QCustomPlot и QByteArray:отображение данных на графике.

можете скинуть пример, как проверить заполнение в QByteArray smile 
Код

    if(arr[0]==0xA5)
    {
        serial->read();
    }

я делал, но походу это не то.  да и спасибо вам smile и с Наступающим smile 
PM MAIL   Вверх
math64
Дата 30.12.2015, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Я на предудущей странице этой темы показывал фрагмент моего SerialHelper.
В processData() ищется синхробайт (0xA5 в твоём случае), убеждаюсь что сообщение принято полностью (у меня в протоколе - второй байт - длина сообщения), проверяю контрольную сумму, если она совпадает, делаю messageReceived(char* buf, int len); и уже основная программа его обрабатывает.
PM   Вверх
7BON
Дата 4.1.2016, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



math64 можете объяснить:
1. что за переменная unprocessedData и для чего она?
2. 
Код

QByteArray ba = serial->read(bytes);

в этой строке создается массив и считывается с него байты, я понял так?
3.в этой строке
Код

if(bytes>0)
{
    recieved+=bytes;

это наподибии вот этого?
Код

for (int i = 0; i < sizeof(frame.reserved)/sizeof(frame.reserved[0]); i++)
out << frame.reserved[i];

4.
Код

int processed = processData((const byte*)unprocessedData.data(),unprocessedData.size());

в этой строке прописать заместо byte 0xA5 для проверки я так понял?

PM MAIL   Вверх
math64
Дата 11.1.2016, 09:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



1. unprocessedData - массив необработанных байтов.
2. ba - новые прочитанный байты.  Добавляются к unprocessedData.
3. received - счетчик принятых байтов. Выводится в статус-строке. Необязательно.
4. processData выделяет в unprocessedData целое сообщение, т.е. ищет синхробайт 0xA5, проверяет что все данные считаны и контрольная сумма правильна, и делает emit messageReceived(buf, len);
Если отсутствует синхробайт или контрльная сумма неправильна можешь делать emit garbageReceived(buf, len); - если хочешь обрабатывать мусор.
Возвращает число обработанных байт, которые удаляются из unprocessedData.
В слоте onMessageReceived(buf, len) разбираешь тело сообщения - можешь использовать QDataStream, можешь накладывать структуру или разбирать вручную  (не забывай поменять порядок байт в слове).
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

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

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


 




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


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

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