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!


  • Moderators

    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":http://developer.qt.nokia.com/forums/viewthread/11634/#67246 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)?


  • Moderators

    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?


  • Moderators

    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);
    serialPort->setBaudRate(BAUD115200);
    serialPort->setFlowControl(FLOW_OFF);
    serialPort->setParity(PAR_NONE);
    serialPort->setDataBits(DATA_8);
    serialPort->setStopBits(STOP_2);
    @


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.