Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Eugene1911 от Сентябрь 10, 2014, 12:55



Название: Прием данных
Отправлено: Eugene1911 от Сентябрь 10, 2014, 12:55
Здравствуйте :)
У меня возникла следующая проблема при приеме данных: сначала приходил не весь пакет байтов (необходимо 5, а приходило по 2). Я соединил сигнал readyRead со слотом wait_serialReceive, а в нем вызвал singleShot:
Код:
void MainWindow::wait_serialReceive()//ожидание приема полного пакета данных
{
    QTimer::singleShot(5, this, SLOT(serialReceive()));
}


В слоте serialReceive() читаю данные и вывожу их на текстовую метку и через qDebug:
Код:
void MainWindow::serialReceive()//прием данных
{
    QByteArray temp_data;
    int a;

    temp_data = serial->readAll();

    a = temp_data[0];
    qDebug()<<"first byte"<<a;
    qDebug()<<"all array"<<temp_data.toHex();
    ui->labelRead->setText(temp_data.toHex());
}

При запуске программы текстовая метка остается пустой, а qDebug пишет:
first byte 7
all array "07a46c450a"
first byte 0
all array ""

Т.е. программа читает данные, а потом очищает массив? Или как?


Название: Re: Прием данных
Отправлено: Eugene1911 от Сентябрь 10, 2014, 13:27
Проблема решилась так:
temp_data объявил в хедере
В слот wait_serialReceive добавил строчку
Код:
temp_data.clear();

Теперь все отображается. Есть еще один вопрос: сообщение которое выводится в метке, неправильное, должно быть так:
"a46c450a07"
а выводится так:
"07a46c450a".
Может, все-таки я накосячил при приеме?


Название: Re: Прием данных
Отправлено: Bepec от Сентябрь 10, 2014, 13:54
Всё у тебя правильно. Ты массив не правишь. Ты просто копируешь его первый элемент. Чтобы его убрать, надо сделать remove


Название: Re: Прием данных
Отправлено: Eugene1911 от Сентябрь 10, 2014, 14:02
Ясно, спасибо :)


Название: Re: Прием данных
Отправлено: 8Observer8 от Сентябрь 12, 2014, 07:18
Почему у вас 5 написано?
Код
C++ (Qt)
QTimer::singleShot(5, this, SLOT(serialReceive()));
Это чтобы за 5 милисекунд успеть забрать данные? Или я что-то не понял?


Название: Re: Прием данных
Отправлено: Eugene1911 от Сентябрь 12, 2014, 09:41
Мне нужно установить время, за которое придет весь пакет данных. Я пробовал ставить разное время, в итоге остановился на 5 мс, т.к. за это время все байты успевают придти. А большее время решил не устанавливать))


Название: Re: Прием данных
Отправлено: Old от Сентябрь 12, 2014, 09:43
Мне нужно установить время, за которое придет весь пакет данных. Я пробовал ставить разное время, в итоге остановился на 5 мс, т.к. за это время все байты успевают придти. А большее время решил не устанавливать))
А вы уверены, что и на других компьютерах данные будут успевать приходить за 5 мс? :)
Думаю лучше сразу делать нормально и универсально.


Название: Re: Прием данных
Отправлено: Eugene1911 от Сентябрь 12, 2014, 09:58
Да, вы правы,я об этом не подумал)) А как тогда лучше сделать? Просто установить значение таймера побольше или сделать как-то по другому? Всего нужно принять 5 байтов :)


Название: Re: Прием данных
Отправлено: Old от Сентябрь 12, 2014, 10:04
Да, вы правы,я об этом не подумал)) А как тогда лучше сделать? Просто установить значение таймера побольше или сделать как-то по другому? Всего нужно принять 5 байтов :)

Так вы и ждите в слоте wait_serialReceive() что бы были доступны нужные 5 байт, а потом вычитывайте их и обрабатывайте.
Код
C++ (Qt)
void MainWindow::wait_serialReceive()
{
   if( serial->bytesAvailable() < 5 )
       return;
 
   QByteArray data = serial->read( 5 );
 
   // Обрабатываем....
}
 

Ну и 5 лучше константой заменить.


Название: Re: Прием данных
Отправлено: OKTA от Сентябрь 12, 2014, 10:06
Old - скоропечтная машинка! Не даешь слова сказать  ;D


Название: Re: Прием данных
Отправлено: Eugene1911 от Сентябрь 12, 2014, 10:09
Спасибо большое за совет, переделаю :)