2016-04-24 1 views
0

Я пытаюсь отправить 1/0 на мой совет ARDUINO &, пытаясь получить некоторые данные с доски в качестве ответа, я использую QextSerialPort (Qt lib) для этого, но я не способный писать любые данные на доску & также не в состоянии получить какие-либо данные.писать данные с помощью QextSerialPort записывает 0 байт всегда

QextSerialPort

QDebug() < < "send.size():" < < send.size() < < "данные =" < < send.data() < < "Письменное =" < < port-> write (send, send.size()); Эта печать: send.size(): 1 data = 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: 
     ; 
    } 
    } 
} 

решена:

я перешел в класс QSerialPort в Qt5.5, она работала 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, что является ошибкой. Попробуйте это первым.

Другое дело, что QSerialPort отлично работает на linux/windows и прост в использовании ... но я не пробовал его на ARDUINO, в какой ОС вы работаете?

+0

Спасибо, но я не пробовал это, попробую. Вместо этого я переключился на класс QSerialPort в Qt5, и это сработало для меня. – NDestiny