Russian Qt Forum
Ноябрь 26, 2024, 02:25 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Прием данных  (Прочитано 4020 раз)
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 ""

Т.е. программа читает данные, а потом очищает массив? Или как?
Записан
Eugene1911
Гость
« Ответ #1 : Сентябрь 10, 2014, 13:27 »

Проблема решилась так:
temp_data объявил в хедере
В слот wait_serialReceive добавил строчку
Код:
temp_data.clear();

Теперь все отображается. Есть еще один вопрос: сообщение которое выводится в метке, неправильное, должно быть так:
"a46c450a07"
а выводится так:
"07a46c450a".
Может, все-таки я накосячил при приеме?
Записан
Bepec
Гость
« Ответ #2 : Сентябрь 10, 2014, 13:54 »

Всё у тебя правильно. Ты массив не правишь. Ты просто копируешь его первый элемент. Чтобы его убрать, надо сделать remove
Записан
Eugene1911
Гость
« Ответ #3 : Сентябрь 10, 2014, 14:02 »

Ясно, спасибо Улыбающийся
Записан
8Observer8
Гость
« Ответ #4 : Сентябрь 12, 2014, 07:18 »

Почему у вас 5 написано?
Код
C++ (Qt)
QTimer::singleShot(5, this, SLOT(serialReceive()));
Это чтобы за 5 милисекунд успеть забрать данные? Или я что-то не понял?
Записан
Eugene1911
Гость
« Ответ #5 : Сентябрь 12, 2014, 09:41 »

Мне нужно установить время, за которое придет весь пакет данных. Я пробовал ставить разное время, в итоге остановился на 5 мс, т.к. за это время все байты успевают придти. А большее время решил не устанавливать))
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #6 : Сентябрь 12, 2014, 09:43 »

Мне нужно установить время, за которое придет весь пакет данных. Я пробовал ставить разное время, в итоге остановился на 5 мс, т.к. за это время все байты успевают придти. А большее время решил не устанавливать))
А вы уверены, что и на других компьютерах данные будут успевать приходить за 5 мс? Улыбающийся
Думаю лучше сразу делать нормально и универсально.
Записан
Eugene1911
Гость
« Ответ #7 : Сентябрь 12, 2014, 09:58 »

Да, вы правы,я об этом не подумал)) А как тогда лучше сделать? Просто установить значение таймера побольше или сделать как-то по другому? Всего нужно принять 5 байтов Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #8 : Сентябрь 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 лучше константой заменить.
Записан
OKTA
Гость
« Ответ #9 : Сентябрь 12, 2014, 10:06 »

Old - скоропечтная машинка! Не даешь слова сказать  Смеющийся
Записан
Eugene1911
Гость
« Ответ #10 : Сентябрь 12, 2014, 10:09 »

Спасибо большое за совет, переделаю Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.378 секунд. Запросов: 23.