2016-04-24 11 views
0

私はARDUINOボードに1/0を送信しようとしています&これはQextSerialPort(Qt lib)を使用しています。ボードにデータを書き込むことができる&もデータを受け取ることができません。QextSerialPortを使用してデータを書き込むと、常に0バイトが書き込まれます

QextSerialPort

qDebug()< < "send.size():" < < send.size()< < "データ=" < < send.data()< < < < "=書き込ま" port-> write(send、send.size()); この印刷:send.size():1データ= 1 Written = 0 //毎回0バイトを書くことを意味します。

私のコードに問題はありますか?

void MainWindow::ledOnOff(bool on) 
{ 
    if(port == 0) 
    { 
     port = new QextSerialPort("COM6", QextSerialPort::EventDriven);  //QextSerialPort* port is class member 
     port->setBaudRate(BAUD9600); 
     port->setFlowControl(FLOW_OFF); 
     port->setParity(PAR_NONE); 
     port->setDataBits(DATA_8); 
     port->setStopBits(STOP_2); 

     connect(port, SIGNAL(readyRead()), this, SLOT(onReadyRead())); 

     if(port->open(QIODevice::ReadWrite) == true) 
     { 
      qDebug() << "Port open success"; 
     } 
     else 
     { 
      qDebug() << "Port open success"; 
     } 
    } 
    else 
    { 
     port->close(); 
    } 

    quint8 writeByte = 0; 

    if(on) 
    { 
     writeByte = 1; 
    } 

    if(port->isOpen() || port->open(QIODevice::ReadWrite) == true) 
    { 
     QByteArray send; 
     send.resize(writeByte); 
     send = QByteArray::number(writeByte); 

     port->flush(); 
     qDebug() << "send.size() : " << send.size() << " data = " << send.data() 
       <<" Writtend = " << port->write(send, send.size()); 
    } 
    else 
    { 
     qDebug() << "device failed to open:" << port->errorString(); 
    } 
} 


void MainWindow::onReadyRead() 
{ 
    QByteArray bytes; 
    quint8 a = port->bytesAvailable(); 
    bytes.resize(a); 
    port->read(bytes.data(), bytes.size()); 

    qDebug() << bytes.constData(); 
} 

私のArduinoのコードは次のとおりです。解決

uint8_t chosen = 0; 

    void setup() 
    { 
    pinMode(13, OUTPUT); 
    Serial.begin(9600); 
    } 

    void loop() 
    { 

if(Serial.available()) 
{ 
    switch(Serial.read()) 
    { 
    case '1': 
     chosen = 1; 
     break; 
    case '2': 
     chosen = 2; 
     break; 
    default: 
     Serial.println("Bad Choice."); 
     chosen = 0; 
    } 

    Serial.println(chosen, DEC); 

    switch(chosen) 
    { 
     case 1: 
     digitalWrite(13, HIGH); 
     break; 
     case 2: 
     digitalWrite(13, LOW); 
     break; 
     default: 
     ; 
    } 
    } 
} 

を私はQt5.5にQSerialPortクラスに切り替え、それはgreateのを働きました。

&あなたがイベントでモードを駆動しているので、また私のaurdinoコード(コピーペースト効果)

switch(Serial.read()) 
    { 
    case 1:  //It should be 1 not '1' 
     chosen = 1; 
     break; 
    case 2:  //It should be 2 not '2'  
     chosen = 2; 
     break; 
    default: 
     Serial.println("Bad Choice."); 
     chosen = 0; 
    } 

答えて

0

での問題は、あなたがまた例えば、信号bytesWritten(qint64 bytes)を接続する必要がありますがあります:

connect(port, SIGNAL(bytesWritten()), this, SLOT(onBytesWritten())); 

次に実装スロット:

onBytesWritten(qint64 bytes) 
{ 
    qDebug() << "Bytes written " << bytes << std::endl; 
} 

イベントドリブンモードeは、port->write(...)が、別のスレッドでこれを行うので、最終的に書き込まれるバイト数を返すかどうかは絶対にわかりません....少なくとも、それはエラーである-1で応答していません。まずこれを試してみてください。

もう1つのことはlinux/windows上でうまく動作し、使いやすいです...しかし、ARDUINOで試したことはありませんが、どのOSを実行していますか?

+0

ありがとう、しかし、私はこれを試していない、試してみましょう。代わりに私はQt5でQSerialPortクラスに切り替えました。 – NDestiny

関連する問題