2016-08-09 86 views
0

Ich habe festgestellt, dass setup() immer wieder ausgeführt wird. Ich erhalte die gleichen Nachrichten von setup() Hier ist der Code:Qt UI zu Arduino Serielle Verbindung. Setup mehrfach aufgerufen

enum flags{ 
    RFID=  1, 
    LASER_ON= 2, 
    LASER_OFF= 4, 
    . 
    . 
    . 
}; 

int inByte; 
bool fcount = false; 
unsigned int count=0; 
long average_input=0; 
bool cont = false; 
int prev=-1; 
/** 
* Initialize. 
*/ 
void setup() { 
    Serial.begin(9600); // Initialize serial communications with the PC 
// while (!Serial);// Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4) 
// Serial1.begin(19200); 
// while (!Serial1); 
// SPI.begin();  // Init SPI bus 
// mfrc522.PCD_Init(); // Init MFRC522 card 
    pinMode(laser, OUTPUT); 
    pinMode(13, OUTPUT); 
    // Prepare the key (used both as key A and as key B) 
    // using FFFFFFFFFFFFh which is the default at chip delivery from the factory 
// for (byte i = 0; i < 6; i++) { 
//  key.keyByte[i] = 0xFF; 
// } 

    Serial.println(F("Scan a MIFARE Classic PICC to demonstrate read and write.")); 
    Serial.print(F("Using key (for A and B):")); 
// dump_byte_array(key.keyByte, MFRC522::MF_KEY_SIZE); 
    Serial.println(); 

    Serial.println(F("BEWARE: Data will be written to the PICC, in sector #1")); 

    digitalWrite(laser, HIGH); 
    for(byte i =0; i<10 ; i++){ 
     average_input += analogRead(photocell); 
     delay(10); 
    } 
    Serial.print("total sum=\t");Serial.println(average_input); 
    average_input /=10; 
    Serial.print("average=\t");Serial.println(average_input); 
    digitalWrite(laser, LOW); 
} 

/** 
* Main loop. 
*/ 
void loop() { 
    if(Serial.available()){ 
     delay(2000); 
     Serial.println("Serial available"); 
     int input = 0; 
     while (Serial.available()){ 
      input = input*10 + (Serial.read()-48); 
      inByte = input; 
     } 
     Serial.println(inByte); 
    } 
// if(Serial1.available()){ 
//  delay(100); 
//  Serial.println("Serial1 available"); 
//  int input = 0; 
//  while (Serial1.available()){ 
//   input = input*10 + (Serial1.read()-48); 
//   inByte = input; 
//  } 
//  Serial.println(inByte); 
// } 
    switch(inByte){ 
     case RFID: 
      Serial.println("RFID CHOSEN"); 
//  get_rfid();  
      break; 
     case LASER_ON: 
      digitalWrite(laser, HIGH); 
      fcount=true; 
      break; 
     case LASER_OFF: 
      digitalWrite(laser, LOW); 
      fcount=false; 
      break; 
     . 
     . 
     . 
    } 

    if (fcount){ 
     . 
     . 
     . 
} 

Wie Sie mir viel sehen auf Kommentar, nur versucht, setup() läuft nur einmal zu machen. Als generelles Ziel: Ich versuche, meine Qt UI über QSerialPort zu verbinden. Ich habe eine gute Lösung zu einem ähnlichen Thema gefunden und angenommen. Hier ist der Qt-Code:

. 
. 
. 
QSerialPort serial; 
    QStringList ports; 
    for (QSerialPortInfo port : QSerialPortInfo::availablePorts()){ 
     qDebug() << port.portName() << port.vendorIdentifier() << port.productIdentifier() 
         << port.hasProductIdentifier() << port.hasVendorIdentifier() << port.isBusy(); 
       ports += port.portName(); 
    } 

    serial.setPortName("cu.usbmodem1471"); 
    serial.open(QIODevice::ReadWrite); 
    serial.setBaudRate(QSerialPort::Baud9600); 
    serial.setDataBits(QSerialPort::Data8); 
    serial.setParity(QSerialPort::NoParity); 
    serial.setStopBits(QSerialPort::OneStop); 
    serial.setFlowControl(QSerialPort::NoFlowControl); 
    qDebug()<<serial.isOpen()<<endl; 
    qDebug()<<serial.isWritable()<<endl; 
      if (serial.isOpen() && serial.isWritable()) 
         { 

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


. 
. 
. 

Zunächst einmal zeigt es falsefalse sowohl auf isOpen() und isWritable(), wenn die serielle Monitor geöffnet wird. Meine Vermutung ist, dass Qt versucht, Daten an die selbe serielle Schnittstelle anzuschließen oder zu senden, auf der Daten empfangen werden. Wenn der serielle Monitor geschlossen wird, werden die Flags auf truetrue gesetzt und die Nachricht wird gesendet. Es geht jedoch durch den gleichen Setup-Prozess (aka Kalibrierung Laser) und nicht erhalten 2 als Flag zum Einschalten des Lasers. Bitte beraten Sie mich über die serielle Kommunikation zwischen PC und Arduino.

Antwort

1

Der serielle Port wird ausschließlich von einer Anwendung verwendet, entweder SerialMonitor oder Qt.

Das Öffnen eines COM-Anschlusses (sowohl mit SerialMonitor als auch mit Qt) löst normalerweise einen Reset des Arduino aus. Deshalb wird setup() ausgeführt. Hiermit wird das Hochladen neuer Skizzen vereinfacht. Dies wird durch Umschalten des seriellen Steuersignals DTR erreicht.

Ich bin kein Qt-Experte, um genau zu wissen, wie man dies auf der PC-Seite deaktiviert. Einige Terminalprogramme geben Ihnen die Kontrolle über dieses DTR-Signal.

Mögliche Lösungen:

  • die serielle Leitung Öffnen Sie nur einmal und halten Sie sie so lange geöffnet, wie Sie Ihre Qt App aktiv ist.

  • Wenn Sie einen 10 μF Kondensator oder ähnliches haben, stecken Sie ihn in den Arduino zwischen GND und RESET. Dies sollte den automatischen Reset verhindern. (Zum Hochladen der neuen Skizze entfernen)