[英]QSerialPort choosing a port from combobox
我有一個包含端口名稱的 combobox,然后我選擇一個端口來啟動串行通信。 我使用“COM6”端口。
我創建 combobox 名稱。
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());
最后,我創建了 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");
}
}
}
output 是:
"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();
}
好的,我已經完成了,我想分享未來。
//Port change
bool currentPortNameChanged = false;
QString currentPortName = ui->comboBox->currentText();
if (currentPortName != mSerialPort->portName()){
currentPortName = mSerialPort->portName();
currentPortNameChanged = true;
}
if(currentPortNameChanged){
mSerialPort->close();
mSerialPort->setPortName(currentPortName);
if (!mSerialPort->open(QIODevice::ReadWrite)) {
qDebug()<< (tr("Can't open %1, error code %2")
.arg(mSerialPort->portName()).arg(mSerialPort->error()));
return;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.