Important: Please read the Qt Code of Conduct -

QextSerialPort - ReadWrite mode trouble

  • Hi,
    I need some help to be able to properly communicate with a device by qextserialport.
    It operates at 9600bps with no flow control.

    In ReadOnly mode I can manage bytes coming from the device since the device sends some bytes to allow me to "sync" and so I can properly read the following bytes...

    Problems arise when the device is not operating as master (when I need so send a command to read the answer that follows ReadWrite mode is required).
    I need to send one or two bytes and then the device should answer by sending one or two bytes.
    It should be simple but I often see data lost.
    By using @while (port->bytesAvailable()<1)
    usleep(5000);@ before port->readRawData call nothing change.
    I also added port->flush() or port->readAll() before port->write(...) but I didn't solve the trouble.

    The code that manages the serial port is on a thread different from the main one. I didn't subclass the QThread class but moved my class that manages the serial device to a different thread. I think it should work...

    Should I use buffered or unbuffered mode? And what about timeout (port settings)?
    What do you suggest?
    Thank you!

  • I am using the same serial port for reading/writing in an application. The application uses QextSerialPort and opens it with QIODevice::ReadWrite .

    There is also another class QSerialDevice available. "Here": you find some details on it.

  • Before evaluating to prefer QSerialDevice, I'd like to be sure I'm properly using QextSerialPort.
    I obviously use ReadWrite mode to be able to read&write.

    How would you write two bytes and then read the answer (2 bytes too)?

  • The reading and writing is done in different threads. When bytes are reeived a readyRead() signal is issued.

    When I started to use QextSerialPort I have found a derivative showing that approach. I have used this for guiding my implementation.

    At that time I have found source obviously having the same origin, but following different strategies. I did not find the SourceForge version (now in Google) at that time. Unfortunately, I cannot change easily.

    When the pain is large enough and I need a serial device implementation I probably will have a very close look to QSerialDevice.

  • But are you referring to QextSerialPort::EventDriven mode?
    I think it's not mandatory, is it?

  • That is the way I am using it. I have never tested the other mode.

  • QextSerialPort::EventDriven mode didn't solve the troubles.
    So I tried to manage the RS232 by QSerialDevice and nothing changed.
    Then I found that by writing one byte at time (by QSerialDevice - I had no time to try by QExtSerialPort) in unbuffered mode (in place of writing a QByteArray in buffered or unbuffered mode) everything worked as expected (without usleep calls between consecutive byte writings too).
    So something is still unclear.

  • I don't know if you have the ability to add a message delimiter, I had to do that with my own protocol. Then all I did was loop:

    readBytes = serialport->read(serialport->bytesAvailable());

    and append readBytes to a QString until I reach my message delimiter. At the moment, I'm testing my code with a virtual serial port connecting 2 x VirtualBox's using the following for these serial port settings:

    serialPort = new QextSerialPort(serialDevice, QextSerialPort::EventDriven);

Log in to reply