2016-08-09 2 views
0

나는 setup()이 반복해서 실행된다는 것을 알아 챘습니다. 나는 setup() 에서 같은 메시지를받을 여기 코드는 다음과 같습니다Arduino에 Qt UI 직렬 연결. 여러 번 호출 된 설정

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){ 
     . 
     . 
     . 
} 

당신은 단지 한 번만 setup() 실행을 만들려고, 나는 많은 주석 볼 수 있듯이. 일반적인 목표 : QSerialPort을 통해 내 Qt UI에 연결하려고합니다. 나는 비슷한 주제에 대해 좋은 해결책을 발견하고 그것을 채택했다. 여기에 Qt는 코드의 모든의

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


. 
. 
. 

첫째, isOpen() 및 시리얼 모니터가 열립니다 isWritable() 모두 falsefalse을 보여줍니다. 내 추측은 Qt가 데이터를받는 PC와 동일한 시리얼에 데이터를 연결/전송하려고한다는 것입니다. 직렬 모니터가 닫히면 플래그는 truetrue으로 설정되고 메시지가 전송됩니다. 그러나 그것은 동일한 설정 과정 (일명 레이저 교정)을 거치고 레이저를 켜기위한 플래그로 2를받지 못합니다. PC와 Arduino 간의 시리얼 통신에 관한 조언을 해주십시오.

답변

1

직렬 포트는 응용 프로그램 (SerialMonitor 또는 Qt)에서만 사용됩니다.

일반적으로 COM 포트 (SerialMonitor 또는 Qt)를 열면 Arduino가 재설정됩니다. 그것이 setup()이 실행되는 이유입니다. 새 스케치를 쉽게 업로드하는 데 사용됩니다. 직렬 제어 신호 DTR을 토글 링하여이 작업을 수행 할 수 있습니다.

저는 이것을 PC 측에서 어떻게 비활성화 할 것인지 정확하게 알고 싶지 않습니다. 일부 터미널 프로그램을 통해 DTR 신호를 제어 할 수 있습니다.

가능한 해결 방법 :

  • 한 번만 시리얼 라인을 열고만큼 당신의 Qt는 응용 프로그램이 활성화되어있는 열 유지.

  • 10μF 커패시터 또는 이와 유사한 것이 있으면 GND와 RESET 사이의 Arduino에 연결하십시오. 이렇게하면 자동 재설정이 금지됩니다. (새로운 스케치를 업로드하려면 제거하십시오)