繁体   English   中英

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. 您可以使用来自QSerialPorterror 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”错误消息。 这也解释了为什么它们在写入数据时没有错误消息。

这也解释了为什么同一个程序偶尔能读到数据,而在其他时候失败,(即使没有重建程序,只是重新运行它。)当数据被读取时,处理器负载更大,即运行在背景。 这意味着数据传输速度较慢,因此外部设备可以识别命令并进行回复。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM