[英]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”错误消息。 这也解释了为什么它们在写入数据时没有错误消息。
这也解释了为什么同一个程序偶尔能读到数据,而在其他时候失败,(即使没有重建程序,只是重新运行它。)当数据被读取时,处理器负载更大,即运行在背景。 这意味着数据传输速度较慢,因此外部设备可以识别命令并进行回复。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.