2013-07-29 2 views
0

Im using Window 7 x64 Проблема в том, что я отправляю с Arduino на информацию о ПК, а при чтении порта получаю странный артефакт Arduino send (0000000), который читает ПК (0000 + 000) или что-то подобное (00000 + 00) - (0 + 000000) и т. Д.qextserialport странный читать

Для примера я покажу скриншот

enter image description here

и

enter image description here

открытый порт

bool MainWindow::openPort() 
{ 

    QString strPort = LineConnect->currentText(); 
    port = new QextSerialPort(strPort, QextSerialPort::EventDriven); 

    if (port->open(QIODevice::ReadWrite | QIODevice::Unbuffered) == true) { 


     port->setBaudRate(BAUD9600); 
     port->setDataBits(DATA_8); 
     port->setParity(PAR_NONE); 
     port->setStopBits(STOP_1); 
     port->setFlowControl(FLOW_OFF); 
     port->setTimeout(100); 
     port->waitForReadyRead(10); 
     port->open(QIODevice::ReadWrite | QIODevice::Unbuffered); 
     connect(port,SIGNAL(readyRead()), this, SLOT(onReadyRead())); 
     INFO_conn->append("port "+ port->portName() + " opened.."); 
     INFO_conn->append("port " + port->portName() + " reading.."); 

     return true; 
    } else { 
     INFO_conn->append("port " + port->portName() + " error connection.."); 
    } 
    return false; 
} 

данные прочитанной

void MainWindow::onReadyRead() 
{ 
     /*first option read data*/ 
     QByteArray msg = port->readAll(); 
     int size = msg.size(); 
     QString data = "Data: " + msg + " size: " + QString::number(size); 
     INFO_conn->append(data); 

     /*second option read data*/ 
    // char data[1024]; 
    // QTextStream out(stdout); 

    // out << "data received: "; 
    // int bytesRead = port->read(data, 1024); 
    // data[bytesRead] = '\0'; 
    // out << data << " (" << bytesRead << " bytes)" << endl; 
    // //QString messRead = "data received: " + data +" "+ bytesRead + " bytes"; 
    // INFO_conn->append(data); 

} 

отправить Arduino данные для ПК

void setup() 
{ 
    Serial.begin(9600); 

    ..... 
} 
void loop() 
{ 
    Serial.print(K38); 
    Serial.print(K40); 
    Serial.print(K42); 
    Serial.print(K44); 
    Serial.print(K46); 
    Serial.print(K48); 
    Serial.print(K50); 

    or 

    Serial.print("0000000"); // result same 

} 

Я не могу понять, в чем может быть проблема, перепробовал все. Примеры из библиотеки QexSerialPort слишком читаются. Нужна помощь. Спасибо за помощь.

+0

Вы должны рассмотреть возможность использования QtSerialPort. Я не могу упомянуть о какой-либо причине использования QextSerialPort в новом коде в наши дни. – lpapp

ответ

0

Я бы предложил отладить ваш код последовательного порта с помощью приложения последовательного терминала (Putty, TeraTerm, Hyperterminal). Подключите приложение последовательного терминала к Arduino и посмотрите, получите ли вы ожидаемый результат. Также подключите его к вашему приложению Qt и посмотрите, можете ли вы отправить текст в приложение Qt и получить нормальный вывод. Вы должны быть в состоянии сказать лучше, если проблема связана с кодом на Arduino или на ПК.

+0

Я пришел по вашему совету и получил следующий результат: 1) PUTTY connect arduino port на выходе все нормально (http://rghost.ru/47772883.view) 2) немного сложнее подключиться поэтому для Qt-приложения необходимо было создать 2 виртуальных порта и использовать их: 1 на выходе 2 на входе. На выходе я получил http://rghost.ru/47772929.view в соответствии с итогами I и не знаю, в чем может быть проблема. Наверное, любые ошибки, наверное, неправильно я читал данные (хотя это очень странно, а примеры в библиотеке читаются как) – INTJOGE

+0

Думаю, я лучше пойму вашу проблему. Если вы каждый раз пытаетесь получить ту же самую длину сообщения. Вы можете добавить задержку после того, как Arduino отправит данные, и компьютер ждет сообщения в течение короткого периода времени. Другой альтернативой было бы поставить разделительный символ на выходе Arduino подобно новой строке, а затем на ПК обрабатывать данные по строке за раз. –

+0

Да, конечно, я попытался поставить задержки времени на arduino до 5000 мс. Результат просто изменился в том диапазоне, который я написал в верхней части (00-00000) ...(), также ведет себя примерно циклически. И неясно, нужно ли мне считывать данные в режиме реального времени, почему я буду делать паузу. Что касается опции создания разделителя да, это хороший вариант решения этой проблемы, у меня есть функция, которая делает это, но это не решение и обман. В конце этой недели или в начале следующего появится возможность задать человеку, который знает по этому вопросу, чем я больше, скорее всего, ответ будет найден. – INTJOGE