Arduino QT5 usbserial

Приведен пример использования кросс платформенной библиотеки QT5 в работе с платой Arduino для управления серво приводом Tower Pro Micro Servo 9g.

#include 
String readString;
Servo myservo;

int servo1pos;

void setup() {
Serial.begin(9600); 
myservo.attach(9);
// Вернем серву в начальную позицию. 
// В ноль почему те не возвращается.
// Механические ограничения, поэтому 6
myservo.write(6);
}

void loop() {

while (Serial.available()) {
        delay(3);  //delay to allow buffer to fill 
        if (Serial.available() >0) {
            char c = Serial.read();  //gets one byte from serial buffer
            readString += c; //makes the string readString
        } 
    }

    if (readString.length() >0)
    {
        Serial.println(readString); //see what was received
        
        int commaIndex = readString.indexOf(' ');
        
        String firstValue = readString.substring(0, commaIndex);
        servo1pos = firstValue.toInt();
        
                if ((servo1pos > 0) & (servo1pos < 180)) {      
                myservo.write(servo1pos);
                delay(15); 
                }
        
    }
    //очистим строку
    readString = "";

}

Код формы



 MainWindow
 
  
   
    0
    0
    285
    183
   
  
  
   MainWindow
  
  
   
    
     
      10
      30
      261
      91
     
    
    
     Servo1
    
    
     
      
       220
       20
       31
       16
      
     
     
      max
     
    
    
     
      
       210
       40
       41
       21
      
     
     
      170
     
    
    
     
      
       10
       20
       31
       16
      
     
     
      min
     
    
    
     
      
       10
       40
       41
       21
      
     
     
      6
     
    
    
     
      
       110
       20
       41
       16
      
     
     
      cur
     
     
      Qt::AlignCenter
     
    
    
     
      
       10
       60
       241
       22
      
     
     
      Qt::Horizontal
     
    
   
   
    
     
      10
      0
      261
      26
     
    
   
  
  
   
    
     0
     0
     285
     22
    
   
   
    
     Действия
    
    
    
   
   
  
  
   
    TopToolBarArea
   
   
    false
   
  
  
  
   
    Connect
   
  
  
   
    Disconnect
   
  
 
 
 
 
 
  readData()
 


#include "mainwindow.h"
#include "ui_mainwindow.h"

int servo1pos;
QString gstr;


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    serial = new QSerialPort(this);
    connect(ui->actionConnect, SIGNAL(triggered()), this, SLOT(openSerialPort()));
    connect(ui->actionDisconnect, SIGNAL(triggered()), this, SLOT(closeSerialPort()));

    connect(serial, SIGNAL(error(QSerialPort::SerialPortError)), this,
            SLOT(handleError(QSerialPort::SerialPortError)));

    connect(ui->horizontalSlider, SIGNAL(sliderMoved(int)), this, SLOT(writeData()));

    servo1pos = ui->horizontalSlider->value();
    ui->label_3->setText(QString::number(servo1pos));

    //установим границы horizontalSlider
    ui->horizontalSlider->setMinimum(ui->lineEdit_3->text().toInt());
     ui->horizontalSlider->setMaximum(ui->lineEdit_2->text().toInt());

    ui->serialPortInfoListBox->clear();

       foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) {
           QStringList list;
           list << info.systemLocation();
           ui->serialPortInfoListBox->addItem(list.first(), list);
       }


}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::openSerialPort()
{

    serial->setPortName(ui->serialPortInfoListBox->currentText());
    serial->setBaudRate(QSerialPort::Baud9600);
    serial->setDataBits(QSerialPort::Data8);
    serial->setParity(QSerialPort::NoParity);
    serial->setStopBits(QSerialPort::OneStop);
    serial->setFlowControl(QSerialPort::NoFlowControl);
    if (serial->open(QIODevice::ReadWrite)) {
            ui->actionConnect->setEnabled(false);
            ui->actionDisconnect->setEnabled(true);
        qDebug() << "\nPort settings successfully";
    } else {
        QMessageBox::critical(this, tr("Error"), serial->errorString());
        qDebug() << "\nPort settings failed";

    }
}

void MainWindow::closeSerialPort()
{
    if (serial->isOpen())
        serial->close();
    ui->actionConnect->setEnabled(true);
    ui->actionDisconnect->setEnabled(false);

}


void MainWindow::writeData()
{
    serial->write(gstr.toLocal8Bit());
}

void MainWindow::handleError(QSerialPort::SerialPortError error)
{
    if (error == QSerialPort::ResourceError) {
        QMessageBox::critical(this, tr("Critical Error"), serial->errorString());
        closeSerialPort();
    }
}

void MainWindow::on_horizontalSlider_sliderMoved(int position)
{
    ui->label_3->setText(QString::number(position));
    servo1pos = position;
    gstr = QString::number(servo1pos)  + ":";
}

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include 
#include 
#include 
#include 
#include 
#include 

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void openSerialPort();
    void closeSerialPort();
    void writeData();
    void handleError(QSerialPort::SerialPortError error);
    void on_horizontalSlider_sliderMoved(int position);

private:
    Ui::MainWindow *ui;
    QSerialPort *serial;
};

#endif // MAINWINDOW_H

Все исходные коды доступны на https://github.com/dmitryzakharov1/QT5_Arduino_servo_usb

Как обычно, демонстрация работы

Добавить комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.