QExtSerialPort port->write Problem
I seem to be having difficulty using the PortListener class. If I write to a connected port directly everything is fine. If I write via a public or private function using identical code I get an error:
“Application.exe has encountered a problem and needs to close.”
It seems a bizarre problem so I must be missing something really simple. My apologies in advance if this is the case. I have cut the code down to a minimal case that still generates the problem.
- scPtr = new Session ();
- if (portName == "NULL"){
- qDebug() << "Serial Device NOT FOUND portName = " << portName;
- int i = QMessageBox::warning(this,tr("Connection"),tr("No SerialDevices detected."),QMessageBox::Cancel);
- }else{ qDebug() << "SerialDevice Found. portName = " << portName; }
- PortListener *listener = new PortListener(portName);
- //============ below does not work?===============
- clickTEST0();
- //============ below works======================
- QByteArray ba;
- ba.resize(3);
- ba[0] = 254 ;
- ba[1] = 1;
- ba[2] = 255;
- int i = listener->port->write(ba,ba.length());
- }
- void MainWindow::clickTEST0() {
- QByteArray ba;
- ba.resize(3);
- ba[0] = 254 ;
- ba[1] = 1;
- ba[2] = 255;
- int i = listener->port->write(ba,ba.length());
- }
- Session::Session(){}
- int tempport = 9999;
- QString qstr;
- int portsize = 0;
- for (int i = 0; i < ports.size(); i++) {
- portsize++;
- qstr = ports.at(i).enumName;
- if (qstr == SerialDeviceString) {
- tempport = i;
- tempportname = ports.at(i).portName;
- tempfriendname = ports.at(i).friendName;
- } else {}
- }
- if (portName == "NULL"){ qDebug() << "SerialDevice NOT FOUND portName = " << portName;
- }else{ qDebug() << " SerialDevice FOUND portName = " << portName; }
- return portName;
- }
- PortListener::PortListener(const QString & portName) { //, int iVal){ //portName = this->enumerate();
- if (portName=="NULL"){ //NOT CONNECTED
- }else{ SetPort(portName); }
- }
- this->port = new QextSerialPort(portName, QextSerialPort::EventDriven);
- port->setBaudRate(BAUD115200);
- port->setFlowControl(FLOW_OFF);
- port->setParity(PAR_NONE);
- port->setDataBits(DATA_8);
- port->setStopBits(STOP_1);
- connect(port, SIGNAL(readyRead()), this, SLOT(onReadyRead()));
- connect(port, SIGNAL(dsrChanged(bool)), this, SLOT(onDsrChanged(bool)));
- if (!(port->lineStatus() & LS_DSR))
- qDebug() << "warning: device is not turned on";
- qDebug() << "listening for data on" << port->portName();
- }
- else {qDebug() << "device failed to open:" << port->errorString(); }
- emit onReadyWrite("Listener Created!");
- }
4 replies
I have more problem with this class in the past, now i use this project https://gitorious.org/qserialdevice [gitorious.org] Maybe can help you.
Thanks for the reply. I am aware of QSerialDevice but I have found QextSerialPort to be extremely reliable and very effective for my requirements. It has enabled me to quickly produce a lot of successful code and I am not particularly keen to start from scratch.
The line
PortListener *listener = new PortListener(portName);
seems to be the problem as it makes listener behave with local scope even though it is a member of the MainWindow class.
You must log in to post a reply. Not a member yet? Register here!



