0 / 0 / 0
Регистрация: 07.06.2023
Сообщений: 8
1

Данные через порт_сортировка_вывод на монитор

28.09.2023, 19:55. Показов 574. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Нужна помощь в проекте.
Комп принимает данные через serial port, примерный вид - 1 0 1 0 0 140 +34 -23 1 0... и т. д.
Программа читает данные строки, разделяет данные по пробелу и записывает в переменные. По данным переменных выводится инфа на экран и меняется label. Данные постоянно обновляются.

При запуске кода вылетает окно Widget и аварийно завершается (ASSERT failure in QList<T>::operator[]: "index out of range", file /usr/include/x86_64-linux-gnu/qt5/Qt..ore/qlist.h, line 579 )

mainwindow.cpp

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include "mainwindow.h"
#include "ui_mainwindow.h"
 
#include <QApplication>
#include <QCoreApplication>
#include <QSerialPort>
#include <QtSerialPort/QSerialPortInfo>
#include <QDebug>
#include <QLabel>
 
 
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
 
{
    ui->setupUi(this);
 
    serialPort = new QSerialPort(this);
    serialPort->setPortName("/dev/ttyACM0");
    serialPort->setBaudRate(QSerialPort::Baud9600);
    serialPort->setDataBits(QSerialPort::Data8);
    serialPort->setParity(QSerialPort::NoParity);
    serialPort->setStopBits(QSerialPort::OneStop);
    serialPort->setFlowControl(QSerialPort::NoFlowControl);
    serialPort->open(QIODevice::ReadWrite);
 
    connect(serialPort, SIGNAL(readyRead()), this, SLOT(readData()));
 
    foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
    {
        QSerialPort port;
        port.setPort(info);
        if (port.open(QIODevice::ReadWrite))
        {
            qDebug() << "Название: " + info.portName() + " " + info.description() + info.manufacturer();
        }
    }
}
 
 
 
 
MainWindow::~MainWindow()
{
 
    delete ui;
    serialPort->close();
    delete serialPort;
 
}
 
void MainWindow::readData()
{
 
    QByteArray dataBuffer;                                             // Создаем буфер для чтения данных
 
 
    while (serialPort->waitForReadyRead()) {                           // Читаем данные из порта
        dataBuffer.append(serialPort->readLine());
 
        QList<QByteArray> dataList = dataBuffer.split(' ');            // Разделяем данные по символу " "
        //QList<int> inList;                                               // пишем результат
 
        for (int i=0;i<dataList.size();i++)                              // перебираем все кусочки строки
        {
            int var1 = dataList[0].toInt();                                // переводим их int и записываем в новый массив
            int var2 = dataList[1].toInt();
            int var3 = dataList[2].toInt();
            int var4 = dataList[3].toInt();
            int var5 = dataList[4].toInt();
            int var6 = dataList[5].toInt();
            int var7 = dataList[6].toInt();
            int var8 = dataList[7].toInt();
            int var9 = dataList[8].toInt();
            int var10 = dataList[9].toInt();
            int var11 = dataList[10].toInt();
            int var12 = dataList[11].toInt();
            int var13 = dataList[12].toInt();
            int var14 = dataList[13].toInt();
            int var15 = dataList[14].toInt();
            int var16 = dataList[15].toInt();
            int var17 = dataList[16].toInt();
 
            qDebug() << "Переменная " << i << " : " << dataList[i];       //выводим данные
 
        }
        for (int i=0;i<dataList.size();i++)
        {
        dataList[i].clear();
        }
 
        dataBuffer.clear();                                          // Очищаем буфер данных
    }
}
mainwindow.h

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QMainWindow>
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>
#include <QDebug>
#include <QTimer>
#include <QCoreApplication>
#include <QtCore>
#include <QByteArray>
 
 
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
 
private slots:
 
    void readData();
 
 
 
private:
    Ui::MainWindow *ui;
    QSerialPort *serialPort;
};
#endif // MAINWINDOW_H
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.09.2023, 19:55
Ответы с готовыми решениями:

PC не видит второй монитор через VGA Mainboard, первый монитор работает через DVI графиккарты
Подключил второй монитор через VGA Mainboard - нет сигнала. Первый работает исправно через через...

Монитор через пк показывает лучше, чем монитор через ноутбук. В чём проблема?
Вопрос в заголовке Добавлено через 11 минут Картинка какая-то не приятная, не плавная. Смотреть...

Через некоторое время после работы за компьютером отключается Монитор/Монитор, Клавиатура, мышь
здравствуйте! собрал новый пк, ворде в сборке ошибок нет, все запустилось, винда быстро...

Монитор на двух компьютерах пишет no signal detected, а при подключении через нетбук монитор показывает картинку
Вчера я снял жесткий диск с одного компьютера и поставил его в другой,а в другом было 2...

Игры дико лагают через основной монитор, а через hdmi все летает
Процессор: intel Pentium cpu g3420 3.20 GHz ОЗУ: 4 Гб Видеокарта: GeForce gtx 750ti Материнка:...

14
944 / 566 / 165
Регистрация: 30.03.2021
Сообщений: 1,899
28.09.2023, 20:45 2
строки 67-83: если элементов в списке меньше 16 или он пустой = UB
0
фрилансер
5221 / 4757 / 1000
Регистрация: 11.10.2019
Сообщений: 12,475
28.09.2023, 21:15 3
Цитата Сообщение от SergioSV Посмотреть сообщение
for (int i=0;i<dataList.size();i++)                              // перебираем все кусочки строки
        {
            int var1 = dataList[0].toInt();                                // переводим их int и записываем в новый массив
            int var2 = dataList[1].toInt();
            int var3 = dataList[2].toInt();
            int var4 = dataList[3].toInt();
            int var5 = dataList[4].toInt();
            int var6 = dataList[5].toInt();
            int var7 = dataList[6].toInt();
            int var8 = dataList[7].toInt();
            int var9 = dataList[8].toInt();
            int var10 = dataList[9].toInt();
            int var11 = dataList[10].toInt();
            int var12 = dataList[11].toInt();
            int var13 = dataList[12].toInt();
            int var14 = dataList[13].toInt();
            int var15 = dataList[14].toInt();
            int var16 = dataList[15].toInt();
            int var17 = dataList[16].toInt();
qDebug() << "Переменная " << i << " : " << dataList[i];       //выводим данные
}
странный цикл. В чём смысл этих строк int varN = dataList[N-1].toInt(); ? Просто убери их

Добавлено через 1 минуту
Цитата Сообщение от SergioSV Посмотреть сообщение
for (int i=0;i<dataList.size();i++)
        {
        dataList[i].clear();
        }
dataBuffer.clear();
это всё тоже не нужные действия, можно удалить эти строки
0
0 / 0 / 0
Регистрация: 07.06.2023
Сообщений: 8
29.09.2023, 10:40  [ТС] 4
Всего 17 переменных, не больше и не меньше.
Сделал так:
C++ (Qt)
1
2
3
4
        for (int i=0;i<dataList.size();i++)                              // перебираем все кусочки строки
        {
            inList.append(dataList[i].toInt());
}
Но неправильно раскладывает данные и переменные не от 1 до 17, а - 0, 1, 2, 2, 1 , 2.....
0
фрилансер
5221 / 4757 / 1000
Регистрация: 11.10.2019
Сообщений: 12,475
29.09.2023, 10:54 5
SergioSV,

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <string>
#include <sstream>
 
int main()
{
    QByteArray ba="1 0 1 0 0 140 +34 -23 1 0";
    
    std::string s{ba.data(),ba.size()};
    std::istringstream iss{s};
    int i{};
    while(iss>>i)
    {
        std::cout<<i<<'\n';
    }
}
0
0 / 0 / 0
Регистрация: 07.06.2023
Сообщений: 8
29.09.2023, 17:27  [ТС] 6
Цитата Сообщение от Алексей1153 Посмотреть сообщение
Сообщение от SergioSV
for (int i=0;i<dataList.size();i++)
        {
        dataList[i].clear();
        }
dataBuffer.clear();
это всё тоже не нужные действия, можно удалить эти строки
Без этого не работает, ошибку выдает

Сейчас сделал так, в порт выдает данные, но когда только запускаю, появляется главный widget и label и начинают идти данные, то появляется сообщение что программа не отвечает, но данные в порт идут!
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
void MainWindow::readData()
{
 
    QByteArray ba;                                          // Создаем буфер для чтения данных
 
 
    while (serialPort->waitForReadyRead()) {                      // Читаем данные из порта
        ba.append(serialPort->readLine());
 
 
        QList<QByteArray> dataList = ba.split(' ');         // Разделяем данные по символу " "
        QList<int> inList;                                          // пишем результат
 
        for (int i=0;i<dataList.size();i++)                          // перебираем все кусочки строки
        {
 
          inList.append(dataList[i].toInt());                        // переводим их int и записываем в новый массив
 
 
 
          //qDebug() << "Переменная " << i << " : " << dataList[i];       //выводим данные
 
 
          if ( i == 0 and inList[i] == 1)
          {
              ui->label->setText(dataList[0]);
             QPixmap pixmap("/home/project qt/untitled01/start.png");
             ui->label->setPixmap(pixmap);
 
              qDebug() << "вкл! ";
             }
             if ( i == 1 and inList[i] == 1)
              {
                  qDebug() << "Режим ! ";
              }
              if ( i == 2 and inList[i] == 1)
              {
                  qDebug() << "Режим! ";
              }
.........
 
          ba.clear();                                          // Очищаем буфер данных
        }
 
 
        dataList.clear();
        QThread::msleep(50);
    }
 
}
0
фрилансер
5221 / 4757 / 1000
Регистрация: 11.10.2019
Сообщений: 12,475
29.09.2023, 17:50 7
Цитата Сообщение от SergioSV Посмотреть сообщение
программа не отвечает
пока из порта идут данные, программа будет превращаться в тыкву
Цитата Сообщение от SergioSV Посмотреть сообщение
while (serialPort->waitForReadyRead())
----------

Цитата Сообщение от SergioSV Посмотреть сообщение
dataList.clear();
опять лишнее действие (хотя, тут оно ничего не делает всё равно)

----------

код жуткий, на быстродействие положен огромный болт )))
0
0 / 0 / 0
Регистрация: 07.06.2023
Сообщений: 8
30.09.2023, 01:21  [ТС] 8
Цитата Сообщение от Алексей1153 Посмотреть сообщение
код жуткий, на быстродействие положен огромный болт )))
Я понимаю что до идеала далеко и здесь бы не было бы вопросов если бы все хорошо работало!
Можете помочь?

Добавлено через 6 минут
Цитата Сообщение от sdf45 Посмотреть сообщение
строки 67-83: если элементов в списке меньше 16 или он пустой = UB
Уже переписал код , данные есть, но как сказано выше
Цитата Сообщение от Алексей1153 Посмотреть сообщение
пока из порта идут данные, программа будет превращаться в тыкву
и тут конечно ступор немного....
0
фрилансер
5221 / 4757 / 1000
Регистрация: 11.10.2019
Сообщений: 12,475
30.09.2023, 08:25 9
SergioSV, я бы сделал работу с портом в отдельном потоке. Ну а тут я бы перевёл чтение в слот от сигнала [signal] void QIODevice::readyRead() - так хотя бы не заткнётся очередь обработки сообщений

Цитата Сообщение от SergioSV Посмотреть сообщение
QList<QByteArray> dataList = ba.split(' ');         // Разделяем данные по символу " "
        QList<int> inList;                                          // пишем результат
for (int i=0;i<dataList.size();i++)                          // перебираем все кусочки строки
        {
inList.append(dataList[i].toInt());                        // переводим их int и записываем в новый массив
насчёт этого я привёл обработку выше (пост №5). Кстати, можно даже упростить чуток

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <string>
#include <sstream>
 
int main()
{
    QByteArray ba="1 0 1 0 0 140 +34 -23 1 0";
    
    auto s=ba.toStdString();
    std::istringstream iss{s};
    int i{};
    while(iss>>i)
    {
        std::cout<<i<<'\n';
    }
}
0
0 / 0 / 0
Регистрация: 07.06.2023
Сообщений: 8
30.09.2023, 09:52  [ТС] 10
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
void MainWindow::readData()
{
 
    QByteArray ba;                                          // Создаем буфер для чтения данных
 
 
    while (serialPort->waitForReadyRead()) {                      // Читаем данные из порта
        ba.append(serialPort->readLine());
 
 
        QByteArray ba;
 
        while (serialPort->waitForReadyRead()) {                      // Читаем данные из порта
        ba.append(serialPort->readLine());
 
            auto s=ba.toStdString();
            std::istringstream iss{s};
            int i{};
            while(iss>>i)
            {
                qDebug() << i;
            }
    }
}
}
Данные в порт идут и нет сообщения что программа не отвечает! Но выдает ошибку если хочу взять данные и вывести в label
0
фрилансер
5221 / 4757 / 1000
Регистрация: 11.10.2019
Сообщений: 12,475
30.09.2023, 10:36 11
SergioSV, если MainWindow::readData() - это слот, который ты сейчас подключил к сигналу, то зачем тут наличие строк № 7, 8 и 13 ?

Цитата Сообщение от SergioSV Посмотреть сообщение
Но выдает ошибку если хочу взять данные и вывести в label
что за ошибка?
Как именно, когда и какие выводишь данные?

Добавлено через 59 секунд
опять же, зачем readline, если можно readAll
0
0 / 0 / 0
Регистрация: 07.06.2023
Сообщений: 8
30.09.2023, 10:50  [ТС] 12
Данные через порт_сортировка_вывод на монитор

В зависимости от данных нужно поменять картинку, а где-то просто выводить температуру

Цитата Сообщение от Алексей1153 Посмотреть сообщение
опять же, зачем readline, если можно readAll
Если readALL то данные вразброс
0
0 / 0 / 0
Регистрация: 07.06.2023
Сообщений: 8
30.09.2023, 10:57  [ТС] 13
Данные через порт_сортировка_вывод на монитор

а сейчас так
0
0 / 0 / 0
Регистрация: 07.06.2023
Сообщений: 8
30.09.2023, 11:14  [ТС] 14
Цитата Сообщение от Алексей1153 Посмотреть сообщение
что за ошибка?
Ошибки нет и данные идут, но вылетает сообщение
Данные через порт_сортировка_вывод на монитор
0
Эксперт .NET
5501 / 4269 / 1213
Регистрация: 12.10.2013
Сообщений: 12,280
Записей в блоге: 2
30.09.2023, 21:18 15
Цитата Сообщение от SergioSV Посмотреть сообщение
Ошибки нет и данные идут, но вылетает сообщение
Выносите работу с портом в отдельный поток, пусть читает и через сигнал-слот отправляет данные в интерфейс.
0
30.09.2023, 21:18
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.09.2023, 21:18
Помогаю со студенческими работами здесь

Через что предпочтительнее подключить монитор, через HDMI или Display Port?
Ребят, всем привет!) Подскажите, через что предпочтительнее подключить монитор, через HDMI или...

Где лучше настраивать цвета монитора, через сам монитор или же через драйвер видеокарты?
Спецы, всем привет! В общем настраиваю монитор по цветопередачи (яркость, контраст и т.д.), и вот...

Погас монитор при работе с компьютером. Купил новый монитор - проблема та же: компьютер включается, монитор не реагирует
Начну с начала: Я сидел за компьютером и вдруг монитор погас. Попытался перезагрузить - ничего не...

Не получается отсортировать данные, полученные через api (не обновляются данные)
Здравствуйте, нужно создать веб-приложение для просмотра новостей с помощью rest-api, и реализовать...

Не обновляются/добавляются данные данные через клиент
привет форумчане,не обновляются данные через клиент при нажатии на кнопку ничего не происходит...

Монитор через HDMI(
проблема в том что включая через HDMI мон выдает изображение не целиком( по краям рамка( как от нее...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru