【发布时间】:2021-02-27 10:00:40
【问题描述】:
我有一个包含端口名称的组合框,然后我选择一个端口来启动串行通信。我使用“COM6”端口。
我创建组合框名称。
ui->comboBox->addItem("COM6");
ui->comboBox->addItem("COM5");
ui->comboBox->addItem("COM4");
ui->comboBox->addItem("COM3");
ui->comboBox->addItem("COM2");
ui->comboBox->addItem("COM1");
然后我设置端口名称,
mSerialPort->setPortName(ui->comboBox->currentText());
最后,我创建了函数。
void Widget::on_connectButton_clicked()
{
mSerialPort->open(QIODevice::ReadWrite);
foreach (QSerialPortInfo item, QSerialPortInfo::availablePorts()) {
if (mSerialPort->portName() == "COM6" && item.portName() == "COM6"){
mSerialPort->setPort(item);
if (mSerialPort-> isOpen){ //Control before start writing
QMessageBox::information(this, tr("connected"), "serial communication started");
ui->label_2->setText("Continuing");
}
else {
QMessageBox::critical(this, tr("failed"), mSerialPort->errorString());
}
}
else {
qDebug()<< item.portName();
qDebug()<< mSerialPort->portName();
qDebug()<< ui->comboBox->currentText();
QMessageBox::information(this, "Wrong port", "Cannot be connected");
}
}
}
输出是:
"COM5"
""
"COM6"
一切都很好,但它没有设置名称。
编辑:完整代码
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
qmlRegisterType<FileIO>("FileIO",1,0,"FileIO"); //QObject is used for qml csv reading
ui->setupUi(this);
setupPlots();
setWindowTitle("GUI");
//QSerialPort for serial communication
mSerialPort = new QSerialPort(this);
mSerialPort->setPortName(ui->comboBox->currentText());
mSerialPort->setBaudRate(QSerialPort::Baud9600);
mSerialPort->setDataBits(QSerialPort::Data8);
mSerialPort->setParity(QSerialPort::NoParity);
mSerialPort->setStopBits(QSerialPort::OneStop);
mSerialPort->setFlowControl(QSerialPort::NoFlowControl);
connect(mSerialPort, SIGNAL(readyRead()), this, SLOT(readSerialData()));
//QQuickWidget for rotation widget
ui->quickWidget->setSource(QUrl("qrc:/main.qml"));
ui->quickWidget->show();
//comboBox for choosing connection ports
ui->comboBox->addItem("COM6");
ui->comboBox->addItem("COM5");
ui->comboBox->addItem("COM4");
ui->comboBox->addItem("COM3");
ui->comboBox->addItem("COM2");
ui->comboBox->addItem("COM1");
}
//Serial-GUI Functions
void Widget::readSerialData(){
QByteArray data;
data = mSerialPort->readAll();
QFile file("./data.csv");
QTextStream stream(&file);
qDebug()<< data;
if(!data.isEmpty()) {
if (file.open(QFile::ReadWrite|QIODevice::Append)) {
stream << data;
file.close();
}
}
}
//connect button "on clicked" function
void Widget::on_connectButton_clicked()
{
mSerialPort->open(QIODevice::ReadWrite);
foreach (QSerialPortInfo item, QSerialPortInfo::availablePorts()) {
if (mSerialPort->portName() == "COM6" && item.portName() == "COM6"){
mSerialPort->setPort(item);
if (mSerialPort-> isOpen){ //Control before start writing
QMessageBox::information(this, tr("connected"), "serial communication started");
ui->label_2->setText("Continuing");
}
else {
QMessageBox::critical(this, tr("failed"), mSerialPort->errorString());
}
}
else {
qDebug()<< item.portName();
qDebug()<< mSerialPort->portName();
qDebug()<< ui->comboBox->currentText();
QMessageBox::information(this, "Wrong port", "Cannot be connected");
}
}
}
//disconnect button "on clicked" function
void Widget::on_disconnectButton_clicked(){
mSerialPort->close();
QMessageBox::information(this, tr("disconnected"), "serial communication finished");
ui->label_2->setText("Stopped");
}
Widget::~Widget()
{
delete ui;
mSerialPort->close();
}
【问题讨论】:
-
“它没有设置名称”是什么意思?而且你已经打开了端口就不能再更改了。
-
@chehrlic 在输出
qDebug()<< mSerialPort->portName();是空的我的意思是。因此,您建议在设置完所有内容后我应该开始串行通信。谢谢,我会试试的。 -
当您不设置端口名称时,您期望什么?正如我所说 - 你的
mSerialPort->open(QIODevice::ReadWrite);无法工作,因为你没有设置端口名称 - open() 返回 false (你应该检查) -
我知道在设置端口名称之前它不会打开。我尝试使此端口名称可更改,以便在
mSerialPort->open(QIODevice::ReadWrite);之前添加此代码mSerialPort->setPortName(ui->comboBox->currentText());。如您所见,我在 `open` 之前声明了端口名称,但它仍然没有变成端口名称。 -
你的代码没有显示这个。
标签: c++ qt arduino serial-port