How to open more than once SerialPort
-
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. -
Yes I talk about model, view , controller.
I add all avaibleports to vector in addAvailableSerialPorts ()
i open in openSerialPort(int index) / index=QComboBox->currentIndex();
and close in closeSerialPort(int index) / index=QListWidget->currentRow()+1;and all works fine I think, but if I want show received data on QCustomPlot widget.
I don't know how to convert QByteArray to QVector<double>.
My received data from qDebug() - "\x0B"
Thanks a lot for help :) -
@erytcg
Nope a list of Class * is not really MVC.Do you really need to convert QByteArray to QVector<double> ?
Why not convert to doubles when you read and add directly to QVector instead?Also who sends the doubles? Its not trivial to send doubles over serial as they dont map
nicely to chars and there can be a difference in byteorder and precision loss. -
@erytcg
Yes, i understand CustomPlot wants QVector<double> but i was wondering
instead of storing all values in ByteArray and then convert, if it would be more easy
to store directly in QVector when reading them off the serial port.Anyway, how do u know how many indexes one double will take in ByteArray ?
double is normally 8 bytes (32 bit). Do you know the byte order from the sender? -
Hi
You can test with this sample
Uses QDataStream which should be good and fast.int main(int argc, char *argv[]) { QByteArray byteArray; //generate ten random float value QVector<float> v; for (int i =0; i < 10;++i) { v << 100. * qrand()/RAND_MAX; } //ouput vector qDebug() << v; //write float value to array { QDataStream out (&byteArray,QIODevice::WriteOnly); foreach(float f,v) { out << f; } } //read all float from array QVector<float> v2; { QDataStream in(byteArray); while (!in.atEnd()) { float f; in >> f; v2 << f; } } //ouput vector qDebug() << v2; return 0; }
From here
http://www.qtcentre.org/archive/index.php/t-24744.html -
Maybe I try explain what should my applications do. I send to device command for example: LB - measure temperature and I receive
AAAA, data is exchanged in ASCII format. Number is in Hex format. for example 0x075d. And I want add this received data to plot. And set interval between measurement. -