How to open more than once SerialPort
-
Hello, I'm new on forum and QT :)
I create a application which connect via serial port with devices. I have a problem with connect more than one device via serialport.
I use code from example.void MainWindow::openSerialPort() { SettingsDialog::Settings p = settings->settings(); serial->setPortName(p.name); serial->setBaudRate(QSerialPort::Baud9600); serial->setDataBits(QSerialPort::Data8); serial->setParity(QSerialPort::NoParity); serial->setStopBits(QSerialPort::OneStop); serial->setFlowControl(QSerialPort::NoFlowControl); if (serial->open(QIODevice::ReadWrite)) { ui->connectAction->setEnabled(false); ui->disconnectAction->setEnabled(true); ui->settingsAction->setEnabled(false); showStatusMessage(tr("Connected to %1 : OK") .arg(p.name)); } else { QMessageBox::critical(this, tr("Error"), serial->errorString()); showStatusMessage(tr("Open error")); } }
Someone have good idea how open more ports.
I would be grateful for help. -
Hi and welcome to devnet,
Only one solution: have as many QSerialPort objects.
Using e.g. a
QVector<QSerialPort*>
as member variable to keep them easily manageable. -
Hi @erytcg
To open more than one serialport
you have two create more than one instance of QSerialPort:
For example you have two serial ports on your device : (ttyUSB0, ttyUSB1)
To open these ports you have to do something like this:
QSerialPort* firstSerialPort = new QSerialPort(); QSerialPort* secondSerialPort = new QSerialPort(); firstSerialPort->setPortName("ttyUSB0"); secondSerialPort->setPortName("ttyUSB1"); . . . if (firstSerialPort->open(QIODevice::ReadWrite)) . . . if (secondSerialPort->open(QIODevice::ReadWrite)) . . .
I hope this can help you
-
@erytcg said in How to open more than once SerialPort:
@mostefa I think it's not good idea i don't know how many devices I have to connect
Then what about ?
QVector<QSerialPort *> v; Q_FOREACH(QSerialPortInfo port, QSerialPortInfo::availablePorts()) { QSerialPort* serialPort = new QSerialPort() ; //Here set port informations serialPort->setPort(port); . . . if (serialPort->open(QIODevice::ReadWrite)) { . . v.append(serialPort); } }
-
void MainWindow::openSerialPort() { QVector<QSerialPort *> v; Q_FOREACH(QSerialPortInfo port, QSerialPortInfo::availablePorts()) { QSerialPort* serialPort = new QSerialPort(); serialPort->setPort(port); serialPort->setBaudRate(QSerialPort::Baud9600); serialPort->setDataBits(QSerialPort::Data8); serialPort->setParity(QSerialPort::NoParity); serialPort->setStopBits(QSerialPort::OneStop); serialPort->setFlowControl(QSerialPort::NoFlowControl); if (serialPort->open(QIODevice::ReadWrite)) { v.append(serialPort); ui->listWidget->addItem(p.name); } else { QMessageBox::critical(this, tr("Error"), serialPort->errorString()); showStatusMessage(tr("Open error")); } } } void MainWindow::closeSerialPort() { if (serialPort->isOpen()) { serialPort->close(); QList<QListWidgetItem*> items = ui->listWidget->selectedItems(); foreach(QListWidgetItem * item, items) { delete ui->listWidget->takeItem(ui->listWidget->row(item)); } } showStatusMessage(tr("Disconnected")); }
it's ok?
-
Hi
In void MainWindow::closeSerialPort()
you call if (serialPort->isOpen())But that is only serialPort pointer. you are not using the
Vector<QSerialPort *> v; at all so i wonder if this is what u want ?I imagine you need to loop over v and close all and not just whatever
serialPort points to ? -
@erytcg
Hi
its a list of comports.so v[index] gives a QSerialPort *
But you will have to answer what app does.
Currently you open all comports available on device.
Should closeSerialPort() close them all again?
to close one you would do
QSerialPort * Cur=v[0];
Cur->close();
or even
v[0]->close();Notice i use 0 for closing the first.
So to help you , i need to understand what app does as its uncommon to open ALL comports :)
-
Hi
if you move
QVector<QSerialPort *> v;
to the MainWindow.h (in the class)
and remove serialPort variable also!then you could do
void MainWindow::closeSerialPort( int index)
{
QSerialPort * serialPort = v[index];
if (serialPort->isOpen())
{
serialPort->close();
..and close the one u want with
closeSerialPort( some number) -
Oh u posted while i was writing
Can you use the row index directly to the V list ?
-
If there is a 1 to 1 to the V list ( please rename to comports or something :)
Then you can just use the
void MainWindow::closeSerialPort( int index)
{
QSerialPort * serialPort = v[index];
...and call it from
foreach(QListWidgetItem * item, items) {
int index= ui->listWidget->row(item); //
closeSerialPort( index); -
Hey can you look at code? Now it's ok? :)
void MainWindow::addAvailableSerialPorts() { QVector<QSerialPort *> v; Q_FOREACH(QSerialPortInfo port, QSerialPortInfo::availablePorts()) { QSerialPort* serialPort = new QSerialPort(); serialPort->setPort(port); serialPort->setBaudRate(QSerialPort::Baud9600); serialPort->setDataBits(QSerialPort::Data8); serialPort->setParity(QSerialPort::NoParity); serialPort->setStopBits(QSerialPort::OneStop); serialPort->setFlowControl(QSerialPort::NoFlowControl); v.append(serialPort); } } void MainWindow::openSerialPort(int index) { QSerialPort * serialPort = v[index]; if (serialPort->open(QIODevice::ReadWrite)) { showStatusMessage(tr("Connected to %1 : OK").arg(p.name)); } else { QMessageBox::critical(this, tr("Error"), serialPort->errorString()); showStatusMessage(tr("Open error")); } }
-
@erytcg said in How to open more than once SerialPort:
Almost but one fatal error !
void MainWindow::addAvailableSerialPorts()
{
QVector<QSerialPort *> v; <<<< This is a local var. It should be in class. windows .h. should not be defined here. only used.So in
void MainWindow::openSerialPort(int index)
{
QSerialPort * serialPort = v[index]; <<< what v is this . it cannot be the one from addAvailableSerialPorts as that was local.