Последовательный порт QT не работает

Я пытаюсь записать \ прочитать с устройства с последовательным интерфейсом, используя кабель USB / RS 232.
Я уверен, что мой код записывает «# 002s» (это контрольный код) на последовательное устройство, потому что

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

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

c) код успешно перемещается «ждать написанных байтов (-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");
}

1

Решение

  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. И вы можете поймать ошибку при открытии порта с помощью error signal от QSerialPort

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

Другие решения

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

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

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

0

По вопросам рекламы [email protected]