На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела *nix / gcc / Eclipse / Qt / wxWidgets / GTK+
  • При создании темы ОБЯЗАТЕЛЬНО указывайте версию тулкита / библиотеки / компилятора.
  • Перед тем как задать вопрос, сформулируйте его правильно, чтобы вас могли понять.
  • Нарушение Правил может повлечь наказание со стороны модераторов.


Полезные ссылки:
user posted image Boost по-русски
user posted image Qt по-русски
Модераторы: Majestio
  
> Работа с COM портом АЦП USB-DA10 (QT)
    Здравствуйте!
    Пытаюсь получить данные с АЦП (https://www.chipdip.ru/product/usb-da10, https://www.titan.tw/product/usb-da10/). К порту 6 подключил батарейку 1,5В. Результаты измерения программой для этого АЦП на первом скриншоте, на втором скриншоте команды для 5-7 контактов АЦП. В методе:
    ExpandedWrap disabled
      void MainWindow::Start()
      {
        char cmdAInp[10] = {'Z', 'X', 'C', 'V', 'B', 'N', 'M', ',', '.', '/'};
        QSerialPort serial;
        QString portName = cmbComPort->currentText();
        serial.setPortName(portName);
        // Открытие порта
        if (!serial.open(QIODevice::ReadWrite))
        {
          // Обработка ошибки
          QMessageBox::critical(nullptr, "Ошибка", "Не удалось отрыть COM-порт! Проверьте подключение АЦП!");
          return;
        }
        // Установка параметров
        serial.setBaudRate(QSerialPort::Baud38400);
        serial.setDataBits(QSerialPort::Data8);
        serial.setParity(QSerialPort::NoParity);
        serial.setStopBits(QSerialPort::OneStop);
        serial.setFlowControl(QSerialPort::NoFlowControl);
        uint valIn = spbChannelInput->value();
        QString dataRead;
        char wr = cmdAInp[valIn - 1];
        uint nwr = serial.write(&wr, 1);
        dataRead.append(serial.readAll());
        lblInfo->setText(dataRead);
        serial.close();
      }
    получить данные, аналогичные данным из программы для АЦП, мне не удалось. Пытался посмотреть portmon из Sysinternals Suite, что передается из программы для АЦП в АЦП - получил при административном запуске Error 2. Ранее с помощью PowerShell:
    ExpandedWrap disabled
      $port = New-Object System.IO.Ports.SerialPort "COM3", 38400, None, 8, One
      $port.Open()
      $port.WriteLine("N")
      Write-Output $port.ReadLine()
      $port.Close()
    я получал результаты, близки к результатам программы для АЦП. Раньше с COM портом не работал. Помогите, пожалуйста.
    Прикреплённая картинка
    Прикреплённая картинка

    Прикреплённая картинка
    Прикреплённая картинка
    Сообщение отредактировано: tumanovalex -
      Разобрался.
        Через пару лет только теперь сюда не приходи с тем же вопросом.
          Пришлось сюда опять прийти с вопросом. Консольная программа работы с АЦП
          ExpandedWrap disabled
            #include <QCoreApplication>
            #include <QSerialPort>
            #include <QSerialPortInfo>
            #include <QDebug>
             
            int main (int argc, char *argv[])
            {
              QCoreApplication a (argc, argv);
              QSerialPort serial;
              serial.setPortName("COM3");
              if (serial.isOpen())
                serial.close();
              if (!serial.open(QIODevice::ReadWrite))
              {
                qDebug() << "Не удалось отрыть COM-порт! Проверьте подключение АЦП!";
                return 1;
              }
              serial.setBaudRate(QSerialPort::Baud38400);
              serial.setDataBits(QSerialPort::Data8);
              serial.setParity(QSerialPort::NoParity);
              serial.setStopBits(QSerialPort::OneStop);
              serial.setFlowControl(QSerialPort::NoFlowControl);
              QByteArray temp, res;
              temp.resize(1);
              temp.append('N');
              res.resize(10);
              for(int i = 0; i < 20; ++i)
              {
                serial.write(temp);
                serial.waitForBytesWritten();
                res.clear();
                res.append(serial.readAll());
                serial.waitForReadyRead();
                qDebug() << res;
              }
              serial.close();
              return 0;}
          Вывод программы при одном из запусков:
          ExpandedWrap disabled
            ""
            "1.32V\n\r"
            "1.3"
            "5V\n\r"
            "1.44V\n\r"
            "1.31V\n\r"
            "1.36V\n\r"
            "1.42V\n\r"
            "1.39V\n\r"
            "1.35V\n\r"
            "1.38V\n\r"
            "1.51V\n\r"
            "1.37V\n\r"
            "1.36V\n\r"
            "1.46V\n\r"
            "1.44V\n"
            "\r"
            "1.40V\n\r"
            "1.36V\n\r"
            "1.38V\n\r"
          При других запусках неправильные выводы значений могут быть в других местах. Кроме того, непонятно, почему первое значение пустое. Помогите, пожалуйста, разобраться.
            Снова появился вопрос. Мне нужно записать в порт один символ. Делал так:
            ExpandedWrap disabled
              QByteArray temp, res;
              temp.resize(1);
              temp.append('N')
              serial.waitForBytesWritten();
              serial.write(temp);
            Потом решил проверить, как работает QByteArray в простой программе:
            ExpandedWrap disabled
              int main() {
                QByteArray res;
                for(int i = 0; i < 10; i++)
                {
                  res.clear();
                  res.resize(1);
                  res.append('R');
                  qDebug() << res;
                }
                  return 0;
              }
            Получаю следующий результат:
            ExpandedWrap disabled
              "PR"
              "PR"
              "PR"
              "PR"
              "PR"
              "PR"
              "PR"
              "PR"
              "PR"
              "\x00R"
            Т.е. получается, что записываются в порт 2 значения. Кроме того, непонятно, откуда появляется "P" после resize(1) и последний вывод. Помогите, пожалуйста, разобраться
              Ну смотрите. res.resize(1); устанавливает длину res в 1 байт
              Скрытый текст
              Цитата https://doc.qt.io/qt-6/qbytearray.html#resize
              If newSize is greater than the current size, the byte array is extended to make it newSize bytes with the extra bytes added to the end. The new bytes are initialized to c.

              т.е. после clear длина res = 0 и там пусто, а после resize длина res = 1 и там "extra bytes added to the end". Это тот самый P в выводе перед вашим R
              Сообщение отредактировано: macomics -
                macomics Спасибо большое, теперь понятно.
                Сообщение отредактировано: tumanovalex -
                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                0 пользователей:


                Рейтинг@Mail.ru
                [ Script execution time: 0,0326 ]   [ 17 queries used ]   [ Generated: 16.06.25, 12:52 GMT ]