Reputation: 271
I have a combobox that includes port names, then I choose a port to start a serial communication. I use "COM6" port.
I create combobox names.
ui->comboBox->addItem("COM6");
ui->comboBox->addItem("COM5");
ui->comboBox->addItem("COM4");
ui->comboBox->addItem("COM3");
ui->comboBox->addItem("COM2");
ui->comboBox->addItem("COM1");
Then I set port name,
mSerialPort->setPortName(ui->comboBox->currentText());
Lastly, I create the 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");
}
}
}
And the output is:
"COM5"
""
"COM6"
Everything is fine but it doesn't set the name.
Edit: Full code
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();
}
Upvotes: 0
Views: 610
Reputation: 271
Okay I am done, I want to share for the future.
//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;
}
}
Upvotes: 1