2015-07-22 2 views
1

Я пытаюсь записать \ читать с последовательного устройства с использованием кабеля usb/rs 232. Я уверен, что мой код пишет «# 002s» (это управляющий код) к последовательному порту устройства, потому чтоПоследовательный порт QT не работает

а) последовательный порт открыт

б) последовательный порт для записи

с) код успешно переходит «подождите, записанных байт (-1)»

д) при использовании последовательного порта снифер данные успешно записаны.

Проблема заключается в том, что я не получаю никаких данных, и никакие данные не испускаются с другого устройства. При использовании ввода-вывода qt тот же «# 002s» производит правильный ответ.

Любые идеи?

много спасибо.

#include "test_serial.h" 
#include "ui_test_serial.h" 
#include <QtSerialPort/QtSerialPort> 
#include <QDebug> 

QSerialPort *serial; 
Test_Serial::Test_Serial(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::Test_Serial) 
{ 
    ui->setupUi(this); 

    serial = new QSerialPort(this); 
    connect(serial,SIGNAL(readyRead()),this,SLOT(serialReceived())); 
    serial->setPortName("COM1"); 
    serial->setBaudRate(QSerialPort::Baud9600); 
    serial->setDataBits(QSerialPort::Data8); 
    serial->setParity(QSerialPort::NoParity); 
    serial->setStopBits(QSerialPort::OneStop); 
    serial->setFlowControl(QSerialPort::NoFlowControl); 
    serial->open(QIODevice::ReadWrite); 

    if (serial->isOpen() && serial->isWritable()) 
{ 
    QByteArray input; 

    input = "#"; 
    serial->write(input); 
    serial->waitForBytesWritten(-1); 
    input = "0"; 
    serial->write(input); 
    serial->waitForBytesWritten(-1); 
    input = "0"; 
    serial->write(input); 
    serial->waitForBytesWritten(-1); 
    input = "2"; 
    serial->write(input); 
    serial->waitForBytesWritten(-1); 
    input = "s"; 
    serial->write(input); 
    serial->waitForBytesWritten(-1); 
    input = "\r"; 
    serial->write(input); 
    serial->waitForBytesWritten(-1); 
    serial->flush(); 

    serial->waitForReadyRead(100); 
    QByteArray output = serial->readAll(); 
    ui->label_2->setText(output); 

}} 


Test_Serial::~Test_Serial() 
{ 
    delete ui; 
    serial->close(); 
} 

void Test_Serial::serialReceived() 
{ 
    QByteArray output; 
    output = serial->readAll(); 
    ui->label->setText("output"); 
} 
+0

techneaz благодарит за ответ. Теперь все работает, это проблема времени. –

ответ

0

Этот вопрос заканчивал тем, что readyread флаг только испускаются, если ихние данные для чтения. Однако я слишком быстро отправлял данные для получения внешнего устройства. Это означало, что некоторые данные были потеряны, поэтому устройство никогда не признавало его действительной.

Это означало, что сообщение все еще ожидало завершения сообщения, поэтому сообщение об ошибке «IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_WAIT_ON_MASK) UP STATUS_CANCELLED COM1» после закрытия программы. Это также объясняет, почему у них не было сообщений об ошибках в отношении записи данных.

Это также объясняет, почему одной и той же программе иногда удалось считывать данные, а в других случаях не удалось (даже без переустановки программы, просто перезапустить ее.) Когда данные были прочитаны, процессор был более загружен, т.е. программы, работающие в фоновом режиме. Это означало, что данные передавались более медленно, и, таким образом, внешнее устройство могло распознавать команды и, таким образом, отвечать.

2
  1. Если вы хотите написать "# 002s", почему бы не написать сразу? Может быть, последовательное устройство не может идентифицировать управляющий код при написании каждого символа.

    void Test_Serial::writeDataToSerialPort() 
    { 
        QByteArray input = QString("#002s").toLocal8Bit(); 
        serial->write(input); 
    } 
    
  2. И нет необходимости в этом чтении.

    serial->waitForReadyRead(100); 
        QByteArray output = serial->readAll(); 
        ui->label_2->setText(output); 
    

    Test_Serial::serialReceived будет называться любым способом, если у вас есть ответ от последовательного устройства.

  3. И вы можете поймать ошибку при открытии порта с помощью errorsignal из QSerialPort

    connect(serial,SIGNAL(error(QSerialPort::SerialPortError)),this,SLOT(serialPortError(QSerialPort::SerialPortError))); 
    
    void Test_Serial::serialPortError(QSerialPort::SerialPortError error) 
    { 
        //Print error etc. 
    } 
    
+0

Спасибо за ответ, но мои коды все еще не работают должным образом. Это действительно странно, потому что он работает правильно дважды, но когда я пришел, чтобы снова запустить его, не меняя ничего, он перестает работать. Когда я проверил, что «терминал» выводит свою строку с «Маска - 0x00000001 (EV_RXCHAR)», которую моя программа не выводит. Еще раз спасибо за ответ так быстро. –

+1

Вы чистили и перестраивали? И точно, что не работает? – techneaz

+0

Я восстановил его, но забыл его очистить. Проблема в том, что другое устройство предназначено для отправки ответа, когда «# 002s» отправляется на него, но в настоящее время он ничего не делает. В сниффер последовательного порта эта команда появляется, когда я закрываю программу «IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_WAIT_ON_MASK) UP STATUS_CANCELLED COM1 « –

Смежные вопросы