【问题标题】:Connect Arduino with Qt将 Arduino 与 Qt 连接起来
【发布时间】:2014-08-16 09:42:27
【问题描述】:

我正在将“R”字符从 Qt 发送到 Arduino
并等待那个 R,使 Arduino 上的 LED 闪烁。但它不起作用......

我认为可能是 waitFotBytesWritten 或 ASCI 的问题...
N.B:任何信号都很好;不需要是字符。

我的 Qt 代码:

QSerialPort serial;
        serial.setPortName("PORT_NAME");
        serial.open(QIODevice::ReadWrite);
        serial.setBaudRate(QSerialPort::Baud9600);
        serial.setDataBits(QSerialPort::Data8);
        serial.setParity(QSerialPort::NoParity);
        serial.setStopBits(QSerialPort::OneStop);
        serial.setFlowControl(QSerialPort::NoFlowControl);

        if (serial.isOpen() && serial.isWritable())
        {
            qDebug() << "Ready..." << endl;
            serial.write("R");

            if(serial.flush())
                {
                    qDebug() << "ok" << endl;
                }
                qDebug() <<"value sent!!! "<< endl;
                serial.close();
        }

我的 Arduino 代码

int led = 13; 

void setup()   
{   
pinMode(led, OUTPUT);    
}

void loop() 
{

if (Serial.read() == 'R') //blink on 5sec  
{  
  digitalWrite(led, HIGH);   
  delay(5000);              
  digitalWrite(led, LOW);    
} 

else //Blink on and off 1 sec,1sec  
{  
   digitalWrite(led, HIGH);   
  delay(1000);              
  digitalWrite(led, LOW);   
  delay(1000);  
}

}

Qt 输出显示:

 Manufacturer:  "Arduino (www.arduino.cc)"  
Busy:  false   
Ready...   
ok   
value sent!!!   

任何帮助将不胜感激


这里是完整的代码:

Qt:

#include <QtCore/QCoreApplication>
#include <QtCore/QDebug>

#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>
#include <QString>

QT_USE_NAMESPACE

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QSerialPortInfo info("usbmodem621");
    // Check info of the port
            qDebug() << "Name        : " << info.portName();
            qDebug() << "Manufacturer: " << info.manufacturer(); //if showing manufacturer, means Qstring &name is good
            qDebug() << "Busy: " << info.isBusy() << endl;

            // Initialize Serial
            QSerialPort serial;
            serial.setPortName("usbmodem621");
            serial.open(QIODevice::ReadWrite);
            serial.setBaudRate(QSerialPort::Baud9600);
            serial.setDataBits(QSerialPort::Data8);
            serial.setParity(QSerialPort::NoParity);
            serial.setStopBits(QSerialPort::OneStop);
            serial.setFlowControl(QSerialPort::NoFlowControl);

            if (serial.isOpen() && serial.isWritable())
            {
                qDebug() << "Is open : " << serial.isOpen() << endl;
                qDebug() << "Is writable : " << serial.isWritable() << endl;

                QString string("R\n");
                QByteArray ba("R\n");
                serial.write(ba);
                if (serial.bytesToWrite() > 0)
                {
                    serial.flush();
                    if(serial.waitForBytesWritten(1000))
                    {
                        qDebug() << "data has been send" << endl;
                    }

                }
                if(serial.flush())
                    {
                        qDebug() << "ok" << endl;
                    }
                    qDebug() <<"value sent!!! "<< endl;
                    serial.close();
            }

            else
            {
                qDebug() << "An error occured" << endl;
            }
            return 0;
}

阿杜诺:

int led = 13; 

void setup() 
{ 
Serial.begin(9600);
pinMode(led, OUTPUT); 
}

void loop() 
{ 

  if (Serial.available() > 0)
  {
  digitalWrite(led, HIGH);  
  delay(5000);             

  if(Serial.read() == 'R')
  {
  digitalWrite(led, LOW);   
  delay(1000);  
  }  
  }

else
{
   digitalWrite(led, HIGH);  
  delay(1000);             
  digitalWrite(led, LOW);  
  delay(1000);  
}

}

【问题讨论】:

  • 那么接收端到底发生了什么,你从读数中得到了什么?另外,您如何等待阅读?这不是完整的代码。
  • 嗯,Arduino LED 闪烁 1 秒(他处于第二种状态),但从未进入第一种状态。我正在等待带有if(serial.Read()) 条件的读取...谁在循环中...
  • 这是等待信号的好方法吗?我只是想发送一个信号,而不是特别是一个字符

标签: c++ qt arduino qtserialport


【解决方案1】:

问题已解决:

Qt:

if (serial.isOpen() && serial.isWritable())
            {

                QByteArray ba("R");
                serial.write(ba);
                serial.flush();
                qDebug() << "data has been send" << endl;
                serial.close();
            }

阿杜诺:

int led = 13, avlb = 0; 

void setup() 
{ 
Serial.begin(9600);
pinMode(led, OUTPUT); 
Serial.println("started");
}

void loop() 
{ 
  if (Serial.available() > 0)
  {
    Serial.println("available");
    Serial.println(Serial.available());  
    delay(2000);    
  if(Serial.read())
  {
    Serial.println("read");
    Serial.println(Serial.read());
    delay(2000);
  }  
  }

else
{
  Serial.println("not available");
  delay(1000);
}

}

注意:不要忘记在 Arduino IDE 中正确设置波特率;
在监视器中,9600 波特率

【讨论】:

    猜你喜欢
    • 2014-02-03
    • 1970-01-01
    • 2017-09-24
    • 2023-03-29
    • 2020-01-20
    • 2012-03-10
    • 2022-01-19
    • 2013-01-27
    • 2020-10-10
    相关资源
    最近更新 更多