QT串口不工作

QT serial port not working

我正在尝试使用 usb / rs 232 电缆从串行设备写入\读取。 我很确定我的代码将“#002s”(这是一个控制代码)写入串行设备,因为

a)串口打开

b)串口可写

c) 代码成功导航"wait For Bytes Written (-1)"

d) 使用串口嗅探器写入数据成功

我遇到的问题是我没有收到任何数据,也没有数据从其他设备发出。使用 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. 如果要写“#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. 并且您可以使用 QSerialPort

    中的 error signal 在打开端口时捕获错误
    connect(serial,SIGNAL(error(QSerialPort::SerialPortError)),this,SLOT(serialPortError(QSerialPort::SerialPortError)));
    
    void Test_Serial::serialPortError(QSerialPort::SerialPortError error)
    {
        //Print error etc.
    }
    

问题最终是 readyread 标志只有在他们的数据要读取时才会发出。但是,我发送数据的速度太快,以至于外部设备无法接收它。这意味着一些数据丢失,因此设备从未将其识别为有效命令。

这意味着它仍在等待消息完成,因此在关闭程序时会出现 "IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_WAIT_ON_MASK) UP STATUS_CANCELLED COM1" 错误消息。这也解释了为什么他们没有关于写入数据的错误消息。

这也解释了为什么同一个程序有时成功读取数据,有时失败,(即使不重建程序,也只是重新运行它。)当读取数据时,处理器加载更多,即后台程序 运行。这意味着数据传输速度更慢,因此外部设备可以识别命令并回复。