2017-04-22 9 views
0

시리얼 포트를 통해 라즈베리 파이 (QT C++)에서 Arduino (Arduino IDE C++)로 통신하는 데 일주일 이상 노력했지만 실패.라즈베리 파이 (QT C++)와 Arduino (Arduino IDE) 간의 통신

Google에서 검색을 한 결과 예제를 읽었지만 여전히 성공하지 못했습니다. 좋아, 근본적인 점은 시리얼 포트가 라즈베리 파이부터 Arduino로 계속해서 명령을 보내야한다는 것입니다. 가능한 한 간단하게 코드를 유지하려고했습니다.

처음에는 나무 딸기 파이 (QT C++)에서 Arduino (Arduino IDE C++)로 "J"문자를 보내고 J를 기다리면서 Arduino에서 LED를 깜박입니다. 하지만 작동하지 않습니다. 심지어 & & Arduino (Arduino IDE C++)에 데이터를 전송하는 라즈베리 파이 (QT C++) 통신 인터페이스에 대한 샘플을 얻지 못했습니다. 나는 그 문제가 정확히 무엇인지 모른다. 친절하게 문제 해결을 도와주세요. 모니터에서

, 나는 양쪽에 시도 어떤 프로그램을 첨부

9600 전송 속도.

MAIN.CPP

#include <iostream> 
#include <QIODevice> 

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

using namespace std; 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    Dialog w; 
    w.show(); 

    QSerialPort serialPort; 
    serialPort.setBaudRate(QSerialPort::Baud9600); 

    QSerialPortInfo info("ttyUSB0"); 
     qDebug() << "Name  : "  << info.portName(); 
     qDebug() << "Description : "  << info.description(); 
     qDebug() << "Busy:"    << info.isBusy(); 

     QSerialPort serial; 
     serial.setPortName("ttyUSB0"); 

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

     serial.open(QSerialPort::ReadWrite); 
     cout<<"Readable :"<<serial.isReadable()<<endl; 
     cout<<"Writable :"<<serial.isWritable()<<endl<<endl; 

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

      qDebug() << "Ready..." << endl; 
      serial.write("J"); 

      QByteArray ba("J\n"); 

      serial.write(ba); 
      { 
       QByteArray ba("J"); 
       serial.write(ba); 
       serial.flush(); 
       qDebug() << "data has been send" << endl; 
       serial.close(); 
      } 
      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 a.exec(); 
} 

의 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); 
    digitalWrite(led, HIGH); 
    delay(5000);   

    if(Serial.read() == 'J') 
{ 
    Serial.println("read"); 
    Serial.println(Serial.read()); 
    delay(2000); 
    digitalWrite(led, LOW); 
    delay(1000); 
} 
} 

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

:

는 라즈베리 QT 제작자 IDE의 O/P :

Name  : "ttyUSB0" 
Description : "FT232R USB UART" 
Busy: false 

Readable :1 
Writable :1 

Is open : true 

Is writable : true 

Ready... 

data has been send 

bool QSerialPort::flush(): device not open 
value sent 

의 Arduino 이데 출력 표시 :

started 

not available 
not available 
not available 
not available 
not available 
not available 
not available 
not available 
not available 

답변

0

귀하의 질문에 대한 답변은 다음 코드입니다 : 당신이 serial.flush()을 한 후

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

, 즉시 포트를 닫습니다. 데이터가 실제로 전송 될 때까지 기다려야합니다. 예를 들어 bool QSerialPort :: waitForBytesWritten (int msecs)을 사용합니다.