2016-08-09 7 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側でこれを無効にする方法を正確に知っているQtのエキスパートではありません。ターミナルプログラムによっては、そのDTR信号を制御するものがあります。

回避策:

  • は一度だけシリアルラインを開き、それは限り、あなたのQtアプリがアクティブであるとして開いたまま。

  • 10μFのコンデンサなどを使用している場合は、GNDとRESETの間のArduinoに接続します。これにより、自動リセットが禁止されます。 (新しいスケッチをアップロードするには削除してください)

関連する問題