2014-06-25 177 views
1

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

我认为这可能是一个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; 
} 

的Arduino:

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); 
} 

} 
+0

那么接收端究竟发生了什么,你从阅读中得到了什么?另外,你如何等待阅读?这不是完整的代码。 – lpapp

+0

那么,Arduino领导的闪烁1秒(他处于第二状态),但从未进入第一状态。 我正在等待'if(serial.Read())'条件读取... 谁在循环... – gr3g

+0

这是一个等待信号的好方法吗? 我只想发送一个信号,而不是一个字符 – gr3g

回答

2

问题已经解决:

的Qt:

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

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

Arduino:

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); 
} 

} 

N.B .:不要忘了把波特率正确地放在Arduino IDE中;
在监视器中,9600波特率