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");
}
如果要写“#002s”,为什么不马上写呢?可能是你写的每个字符串口设备都不能识别控制码。
void Test_Serial::writeDataToSerialPort()
{
QByteArray input = QString("#002s").toLocal8Bit();
serial->write(input);
}
不需要这个阅读部分。
serial->waitForReadyRead(100);
QByteArray output = serial->readAll();
ui->label_2->setText(output);
当您收到串口设备的响应时,将以任何方式调用Test_Serial::serialReceived
。
并且您可以使用 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" 错误消息。这也解释了为什么他们没有关于写入数据的错误消息。
这也解释了为什么同一个程序有时成功读取数据,有时失败,(即使不重建程序,也只是重新运行它。)当读取数据时,处理器加载更多,即后台程序 运行。这意味着数据传输速度更慢,因此外部设备可以识别命令并回复。
我正在尝试使用 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");
}
如果要写“#002s”,为什么不马上写呢?可能是你写的每个字符串口设备都不能识别控制码。
void Test_Serial::writeDataToSerialPort() { QByteArray input = QString("#002s").toLocal8Bit(); serial->write(input); }
不需要这个阅读部分。
serial->waitForReadyRead(100); QByteArray output = serial->readAll(); ui->label_2->setText(output);
当您收到串口设备的响应时,将以任何方式调用
Test_Serial::serialReceived
。并且您可以使用
中的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" 错误消息。这也解释了为什么他们没有关于写入数据的错误消息。
这也解释了为什么同一个程序有时成功读取数据,有时失败,(即使不重建程序,也只是重新运行它。)当读取数据时,处理器加载更多,即后台程序 运行。这意味着数据传输速度更慢,因此外部设备可以识别命令并回复。