QSerialPort write failure
-
Hello.
I have some problem with writing data to serial COM port. Sometimes the queries do not complete and get "stuck", making port unusable. I'm adding a picture with the problem (captured using PortMon)
0 0.06566457 SomeGraphicalA IRP_MJ_CREATE VCP0 SUCCESS Options: Open 1 0.00000279 SomeGraphicalA IRP_MJ_CLEANUP VCP0 SUCCESS 2 5.09850628 SomeGraphicalA IRP_MJ_CLOSE VCP0 SUCCESS 3 5.03382300 SomeGraphicalA IRP_MJ_CREATE VCP0 SUCCESS Options: Open 4 0.00000349 SomeGraphicalA IOCTL_SERIAL_GET_BAUD_RATE VCP0 SUCCESS 5 0.00000105 SomeGraphicalA IOCTL_SERIAL_GET_LINE_CONTROL VCP0 SUCCESS 6 0.00000070 SomeGraphicalA IOCTL_SERIAL_GET_CHARS VCP0 SUCCESS 7 0.00000070 SomeGraphicalA IOCTL_SERIAL_GET_HANDFLOW VCP0 SUCCESS 8 0.00000070 SomeGraphicalA IOCTL_SERIAL_GET_BAUD_RATE VCP0 SUCCESS 9 0.00000070 SomeGraphicalA IOCTL_SERIAL_GET_LINE_CONTROL VCP0 SUCCESS 10 0.00000035 SomeGraphicalA IOCTL_SERIAL_GET_CHARS VCP0 SUCCESS 11 0.00000070 SomeGraphicalA IOCTL_SERIAL_GET_HANDFLOW VCP0 SUCCESS 12 0.00029044 SomeGraphicalA IOCTL_SERIAL_SET_BAUD_RATE VCP0 SUCCESS Rate: 9600 13 0.00036305 SomeGraphicalA IOCTL_SERIAL_CLR_RTS VCP0 SUCCESS 14 0.00028800 SomeGraphicalA IOCTL_SERIAL_SET_DTR VCP0 SUCCESS 15 0.00030441 SomeGraphicalA IOCTL_SERIAL_SET_LINE_CONTROL VCP0 SUCCESS StopBits: 1 Parity: NONE WordLength: 8 16 0.00000175 SomeGraphicalA IOCTL_SERIAL_SET_CHAR VCP0 SUCCESS EOF:0 ERR:0 BRK:0 EVT:0 XON:11 XOFF:13 17 0.00054353 SomeGraphicalA IOCTL_SERIAL_SET_HANDFLOW VCP0 SUCCESS Shake:1 Replace:0 XonLimit:2048 XoffLimit:512 18 0.00000175 SomeGraphicalA IOCTL_SERIAL_GET_TIMEOUTS VCP0 SUCCESS 19 0.00000070 SomeGraphicalA IOCTL_SERIAL_SET_TIMEOUTS VCP0 SUCCESS RI:-1 RM:0 RC:0 WM:0 WC:0 20 0.00024087 SomeGraphicalA IOCTL_SERIAL_SET_WAIT_MASK VCP0 SUCCESS Mask: RXCHAR 21 0.00000000 SomeGraphicalA IOCTL_SERIAL_WAIT_ON_MASK VCP0 22 0.03217006 SomeGraphicalA IRP_MJ_WRITE VCP0 * 0xC0000001 Length 7: 10 03 00 01 00 01 D6
The last record means that write operation finished with error. I ask the user with parameters in graphical dialog and connect to port like this:
void MainWindow::connectDevice(DialogCOMPort::Settings inp_settings) { if (serialPort!=NULL) { //serial port was created before, just closing QSerialPortInfo *serialPortInfo = new QSerialPortInfo(*serialPort); if (serialPortInfo->isBusy()) { qDebug("On connecting Device... Something wrong has happened, serial port is broken"); } if (serialPort->isOpen()) { serialPort->close(); } } else { serialPort = new QSerialPort(); this->writeUtil = new SerialPortWriter(serialPort); connect(serialPort, &QSerialPort::readyRead, this, &MainWindow::readReady); } serialPort->setBaudRate(inp_settings.baud); serialPort->setPortName(inp_settings.portAddr); serialPort->setDataBits(inp_settings.dataBits); serialPort->setStopBits(inp_settings.stopBits); serialPort->setParity(inp_settings.parity); serialPort->open(QSerialPort::ReadWrite); }
and the Settings structure:
struct Settings { QString portAddr = ""; QSerialPort::Parity parity = QSerialPort::EvenParity; QSerialPort::BaudRate baud = QSerialPort::Baud19200; QSerialPort::DataBits dataBits = QSerialPort::Data8; QSerialPort::StopBits stopBits = QSerialPort::OneStop; int responseTime = 1000; int numberOfRetries = 3; };
I write to comport like it is shown in example:
void SerialPortWriter::handleBytesWritten(qint64 bytes) { m_bytesWritten += bytes; if (m_bytesWritten == m_writeData.size()) { m_bytesWritten = 0; QString msg=QObject::tr("Data successfully sent to port %1").arg(m_serialPort->portName()); qDebug(msg.toStdString().c_str()); //m_standardOutput << msg << endl; //QCoreApplication::quit(); } }
After I get such state in PortMon, all further writing operations are failing and when I try to close port, I get that IRP_MJ_Cleanup succeeds, but IRP_MJ_CLOSE hangs. So I cannot reopen port, only reboot makes port back online.
I'm using qt 5.8 on Win7, 32bit (bundled with mingw, installed just a week ago)What should I do to make COM port connection working?
-
Hello.
I have some problem with writing data to serial COM port. Sometimes the queries do not complete and get "stuck", making port unusable. I'm adding a picture with the problem (captured using PortMon)
0 0.06566457 SomeGraphicalA IRP_MJ_CREATE VCP0 SUCCESS Options: Open 1 0.00000279 SomeGraphicalA IRP_MJ_CLEANUP VCP0 SUCCESS 2 5.09850628 SomeGraphicalA IRP_MJ_CLOSE VCP0 SUCCESS 3 5.03382300 SomeGraphicalA IRP_MJ_CREATE VCP0 SUCCESS Options: Open 4 0.00000349 SomeGraphicalA IOCTL_SERIAL_GET_BAUD_RATE VCP0 SUCCESS 5 0.00000105 SomeGraphicalA IOCTL_SERIAL_GET_LINE_CONTROL VCP0 SUCCESS 6 0.00000070 SomeGraphicalA IOCTL_SERIAL_GET_CHARS VCP0 SUCCESS 7 0.00000070 SomeGraphicalA IOCTL_SERIAL_GET_HANDFLOW VCP0 SUCCESS 8 0.00000070 SomeGraphicalA IOCTL_SERIAL_GET_BAUD_RATE VCP0 SUCCESS 9 0.00000070 SomeGraphicalA IOCTL_SERIAL_GET_LINE_CONTROL VCP0 SUCCESS 10 0.00000035 SomeGraphicalA IOCTL_SERIAL_GET_CHARS VCP0 SUCCESS 11 0.00000070 SomeGraphicalA IOCTL_SERIAL_GET_HANDFLOW VCP0 SUCCESS 12 0.00029044 SomeGraphicalA IOCTL_SERIAL_SET_BAUD_RATE VCP0 SUCCESS Rate: 9600 13 0.00036305 SomeGraphicalA IOCTL_SERIAL_CLR_RTS VCP0 SUCCESS 14 0.00028800 SomeGraphicalA IOCTL_SERIAL_SET_DTR VCP0 SUCCESS 15 0.00030441 SomeGraphicalA IOCTL_SERIAL_SET_LINE_CONTROL VCP0 SUCCESS StopBits: 1 Parity: NONE WordLength: 8 16 0.00000175 SomeGraphicalA IOCTL_SERIAL_SET_CHAR VCP0 SUCCESS EOF:0 ERR:0 BRK:0 EVT:0 XON:11 XOFF:13 17 0.00054353 SomeGraphicalA IOCTL_SERIAL_SET_HANDFLOW VCP0 SUCCESS Shake:1 Replace:0 XonLimit:2048 XoffLimit:512 18 0.00000175 SomeGraphicalA IOCTL_SERIAL_GET_TIMEOUTS VCP0 SUCCESS 19 0.00000070 SomeGraphicalA IOCTL_SERIAL_SET_TIMEOUTS VCP0 SUCCESS RI:-1 RM:0 RC:0 WM:0 WC:0 20 0.00024087 SomeGraphicalA IOCTL_SERIAL_SET_WAIT_MASK VCP0 SUCCESS Mask: RXCHAR 21 0.00000000 SomeGraphicalA IOCTL_SERIAL_WAIT_ON_MASK VCP0 22 0.03217006 SomeGraphicalA IRP_MJ_WRITE VCP0 * 0xC0000001 Length 7: 10 03 00 01 00 01 D6
The last record means that write operation finished with error. I ask the user with parameters in graphical dialog and connect to port like this:
void MainWindow::connectDevice(DialogCOMPort::Settings inp_settings) { if (serialPort!=NULL) { //serial port was created before, just closing QSerialPortInfo *serialPortInfo = new QSerialPortInfo(*serialPort); if (serialPortInfo->isBusy()) { qDebug("On connecting Device... Something wrong has happened, serial port is broken"); } if (serialPort->isOpen()) { serialPort->close(); } } else { serialPort = new QSerialPort(); this->writeUtil = new SerialPortWriter(serialPort); connect(serialPort, &QSerialPort::readyRead, this, &MainWindow::readReady); } serialPort->setBaudRate(inp_settings.baud); serialPort->setPortName(inp_settings.portAddr); serialPort->setDataBits(inp_settings.dataBits); serialPort->setStopBits(inp_settings.stopBits); serialPort->setParity(inp_settings.parity); serialPort->open(QSerialPort::ReadWrite); }
and the Settings structure:
struct Settings { QString portAddr = ""; QSerialPort::Parity parity = QSerialPort::EvenParity; QSerialPort::BaudRate baud = QSerialPort::Baud19200; QSerialPort::DataBits dataBits = QSerialPort::Data8; QSerialPort::StopBits stopBits = QSerialPort::OneStop; int responseTime = 1000; int numberOfRetries = 3; };
I write to comport like it is shown in example:
void SerialPortWriter::handleBytesWritten(qint64 bytes) { m_bytesWritten += bytes; if (m_bytesWritten == m_writeData.size()) { m_bytesWritten = 0; QString msg=QObject::tr("Data successfully sent to port %1").arg(m_serialPort->portName()); qDebug(msg.toStdString().c_str()); //m_standardOutput << msg << endl; //QCoreApplication::quit(); } }
After I get such state in PortMon, all further writing operations are failing and when I try to close port, I get that IRP_MJ_Cleanup succeeds, but IRP_MJ_CLOSE hangs. So I cannot reopen port, only reboot makes port back online.
I'm using qt 5.8 on Win7, 32bit (bundled with mingw, installed just a week ago)What should I do to make COM port connection working?
@JovanM
I've checked, I'm using the same port options (baud, parity, start bits, stop bits...) as defined in port's options in device manager.This problem appears from time to time, not often, a "ghast" one I'd say.
Nothing is connected to this port (at the time of testing), just sending bytes to it. -
Hi, just guessing but perhaps you also need to turn off xon/xoff, try adding:
serialPort->setStopBits(inp_settings.stopBits); .... serialPort->setFlowControl(QSerialPort::NoFlowControl); ... serialPort->setParity(inp_settings.parity); serialPort->open(QSerialPort::ReadWrite);
-
Hi, just guessing but perhaps you also need to turn off xon/xoff, try adding:
serialPort->setStopBits(inp_settings.stopBits); .... serialPort->setFlowControl(QSerialPort::NoFlowControl); ... serialPort->setParity(inp_settings.parity); serialPort->open(QSerialPort::ReadWrite);
@hskoglund
The docum. says:The default value is NoFlowControl, i.e. no flow control.
So that construction seems more likely a wizardry,
but it gave a resultactually the problem is still here:0 0.01104905 SomeGraphicalA IRP_MJ_CREATE VCP0 SUCCESS Options: Open 1 0.00000244 SomeGraphicalA IRP_MJ_CLEANUP VCP0 SUCCESS 2 0.11511006 SomeGraphicalA IRP_MJ_CLOSE VCP0 SUCCESS 3 0.00302975 SomeGraphicalA IRP_MJ_CREATE VCP0 SUCCESS Options: Open 4 0.00000140 SomeGraphicalA IOCTL_SERIAL_GET_BAUD_RATE VCP0 SUCCESS 5 0.00000035 SomeGraphicalA IOCTL_SERIAL_GET_LINE_CONTROL VCP0 SUCCESS 6 0.00000035 SomeGraphicalA IOCTL_SERIAL_GET_CHARS VCP0 SUCCESS 7 0.00000035 SomeGraphicalA IOCTL_SERIAL_GET_HANDFLOW VCP0 SUCCESS 8 0.00000035 SomeGraphicalA IOCTL_SERIAL_GET_BAUD_RATE VCP0 SUCCESS 9 0.00000000 SomeGraphicalA IOCTL_SERIAL_GET_LINE_CONTROL VCP0 SUCCESS 10 0.00000035 SomeGraphicalA IOCTL_SERIAL_GET_CHARS VCP0 SUCCESS 11 0.00000035 SomeGraphicalA IOCTL_SERIAL_GET_HANDFLOW VCP0 SUCCESS 12 0.00010298 SomeGraphicalA IOCTL_SERIAL_SET_BAUD_RATE VCP0 SUCCESS Rate: 9600 13 0.00009530 SomeGraphicalA IOCTL_SERIAL_CLR_RTS VCP0 SUCCESS 14 0.00023948 SomeGraphicalA IOCTL_SERIAL_SET_DTR VCP0 SUCCESS 15 0.00012393 SomeGraphicalA IOCTL_SERIAL_SET_LINE_CONTROL VCP0 SUCCESS StopBits: 1 Parity: NONE WordLength: 8 16 0.00000035 SomeGraphicalA IOCTL_SERIAL_SET_CHAR VCP0 SUCCESS EOF:0 ERR:0 BRK:0 EVT:0 XON:11 XOFF:13 17 0.00033233 SomeGraphicalA IOCTL_SERIAL_SET_HANDFLOW VCP0 SUCCESS Shake:1 Replace:0 XonLimit:2048 XoffLimit:512 18 0.00000035 SomeGraphicalA IOCTL_SERIAL_GET_TIMEOUTS VCP0 SUCCESS 19 0.00000035 SomeGraphicalA IOCTL_SERIAL_SET_TIMEOUTS VCP0 SUCCESS RI:-1 RM:0 RC:0 WM:0 WC:0 20 0.00009775 SomeGraphicalA IOCTL_SERIAL_SET_WAIT_MASK VCP0 SUCCESS Mask: RXCHAR 21 230.15856027 SomeGraphicalA IOCTL_SERIAL_WAIT_ON_MASK VCP0 CANCELLED 22 0.00028381 SomeGraphicalA IRP_MJ_WRITE VCP0 SUCCESS Length 7: 10 03 00 01 00 01 D6 23 0.00022796 SomeGraphicalA IRP_MJ_WRITE VCP0 SUCCESS Length 7: 10 03 00 02 00 01 26 24 0.00001466 SomeGraphicalA IRP_MJ_CLEANUP VCP0 SUCCESS 25 0.10910221 SomeGraphicalA IRP_MJ_CLOSE VCP0 SUCCESS 26 0.06496813 SomeGraphicalA IRP_MJ_CREATE VCP0 SUCCESS Options: Open 27 0.00000244 SomeGraphicalA IRP_MJ_CLEANUP VCP0 SUCCESS 28 5.09932105 SomeGraphicalA IRP_MJ_CLOSE VCP0 SUCCESS 29 5.03467199 SomeGraphicalA IRP_MJ_CREATE VCP0 SUCCESS Options: Open 30 0.00000279 SomeGraphicalA IOCTL_SERIAL_GET_BAUD_RATE VCP0 SUCCESS 31 0.00000105 SomeGraphicalA IOCTL_SERIAL_GET_LINE_CONTROL VCP0 SUCCESS 32 0.00000105 SomeGraphicalA IOCTL_SERIAL_GET_CHARS VCP0 SUCCESS 33 0.00000070 SomeGraphicalA IOCTL_SERIAL_GET_HANDFLOW VCP0 SUCCESS 34 0.00000105 SomeGraphicalA IOCTL_SERIAL_GET_BAUD_RATE VCP0 SUCCESS 35 0.00000070 SomeGraphicalA IOCTL_SERIAL_GET_LINE_CONTROL VCP0 SUCCESS 36 0.00000070 SomeGraphicalA IOCTL_SERIAL_GET_CHARS VCP0 SUCCESS 37 0.00000035 SomeGraphicalA IOCTL_SERIAL_GET_HANDFLOW VCP0 SUCCESS 38 0.00027194 SomeGraphicalA IOCTL_SERIAL_SET_BAUD_RATE VCP0 SUCCESS Rate: 9600 39 0.00051770 SomeGraphicalA IOCTL_SERIAL_CLR_RTS VCP0 SUCCESS 40 0.00028835 SomeGraphicalA IOCTL_SERIAL_SET_DTR VCP0 SUCCESS 41 0.00030022 SomeGraphicalA IOCTL_SERIAL_SET_LINE_CONTROL VCP0 SUCCESS StopBits: 1 Parity: NONE WordLength: 8 42 0.00000140 SomeGraphicalA IOCTL_SERIAL_SET_CHAR VCP0 SUCCESS EOF:0 ERR:0 BRK:0 EVT:0 XON:11 XOFF:13 43 0.00018118 SomeGraphicalA IOCTL_SERIAL_SET_HANDFLOW VCP0 SUCCESS Shake:1 Replace:0 XonLimit:2048 XoffLimit:512 44 0.00000105 SomeGraphicalA IOCTL_SERIAL_GET_TIMEOUTS VCP0 SUCCESS 45 0.00000105 SomeGraphicalA IOCTL_SERIAL_SET_TIMEOUTS VCP0 SUCCESS RI:-1 RM:0 RC:0 WM:0 WC:0 46 0.00019828 SomeGraphicalA IOCTL_SERIAL_SET_WAIT_MASK VCP0 SUCCESS Mask: RXCHAR 47 116.59613788 SomeGraphicalA IOCTL_SERIAL_WAIT_ON_MASK VCP0 CANCELLED 48 0.03208767 SomeGraphicalA IRP_MJ_WRITE VCP0 * 0xC0000001 Length 7: 10 03 00 03 00 01 77 49 0.00000209 SomeGraphicalA IRP_MJ_CLEANUP VCP0 SUCCESS 50 0.00000000 SomeGraphicalA IRP_MJ_CLOSE VCP0
The first time it was working like a charm, I've sent two requests on COM port (lines 22-23). I closed the program, took some break, restarted it and the problem is back (line 48. On line 50 we see that COM port hangs on closing).
That's a PortMon's log. -
@hskoglund
The docum. says:The default value is NoFlowControl, i.e. no flow control.
So that construction seems more likely a wizardry,
but it gave a resultactually the problem is still here:0 0.01104905 SomeGraphicalA IRP_MJ_CREATE VCP0 SUCCESS Options: Open 1 0.00000244 SomeGraphicalA IRP_MJ_CLEANUP VCP0 SUCCESS 2 0.11511006 SomeGraphicalA IRP_MJ_CLOSE VCP0 SUCCESS 3 0.00302975 SomeGraphicalA IRP_MJ_CREATE VCP0 SUCCESS Options: Open 4 0.00000140 SomeGraphicalA IOCTL_SERIAL_GET_BAUD_RATE VCP0 SUCCESS 5 0.00000035 SomeGraphicalA IOCTL_SERIAL_GET_LINE_CONTROL VCP0 SUCCESS 6 0.00000035 SomeGraphicalA IOCTL_SERIAL_GET_CHARS VCP0 SUCCESS 7 0.00000035 SomeGraphicalA IOCTL_SERIAL_GET_HANDFLOW VCP0 SUCCESS 8 0.00000035 SomeGraphicalA IOCTL_SERIAL_GET_BAUD_RATE VCP0 SUCCESS 9 0.00000000 SomeGraphicalA IOCTL_SERIAL_GET_LINE_CONTROL VCP0 SUCCESS 10 0.00000035 SomeGraphicalA IOCTL_SERIAL_GET_CHARS VCP0 SUCCESS 11 0.00000035 SomeGraphicalA IOCTL_SERIAL_GET_HANDFLOW VCP0 SUCCESS 12 0.00010298 SomeGraphicalA IOCTL_SERIAL_SET_BAUD_RATE VCP0 SUCCESS Rate: 9600 13 0.00009530 SomeGraphicalA IOCTL_SERIAL_CLR_RTS VCP0 SUCCESS 14 0.00023948 SomeGraphicalA IOCTL_SERIAL_SET_DTR VCP0 SUCCESS 15 0.00012393 SomeGraphicalA IOCTL_SERIAL_SET_LINE_CONTROL VCP0 SUCCESS StopBits: 1 Parity: NONE WordLength: 8 16 0.00000035 SomeGraphicalA IOCTL_SERIAL_SET_CHAR VCP0 SUCCESS EOF:0 ERR:0 BRK:0 EVT:0 XON:11 XOFF:13 17 0.00033233 SomeGraphicalA IOCTL_SERIAL_SET_HANDFLOW VCP0 SUCCESS Shake:1 Replace:0 XonLimit:2048 XoffLimit:512 18 0.00000035 SomeGraphicalA IOCTL_SERIAL_GET_TIMEOUTS VCP0 SUCCESS 19 0.00000035 SomeGraphicalA IOCTL_SERIAL_SET_TIMEOUTS VCP0 SUCCESS RI:-1 RM:0 RC:0 WM:0 WC:0 20 0.00009775 SomeGraphicalA IOCTL_SERIAL_SET_WAIT_MASK VCP0 SUCCESS Mask: RXCHAR 21 230.15856027 SomeGraphicalA IOCTL_SERIAL_WAIT_ON_MASK VCP0 CANCELLED 22 0.00028381 SomeGraphicalA IRP_MJ_WRITE VCP0 SUCCESS Length 7: 10 03 00 01 00 01 D6 23 0.00022796 SomeGraphicalA IRP_MJ_WRITE VCP0 SUCCESS Length 7: 10 03 00 02 00 01 26 24 0.00001466 SomeGraphicalA IRP_MJ_CLEANUP VCP0 SUCCESS 25 0.10910221 SomeGraphicalA IRP_MJ_CLOSE VCP0 SUCCESS 26 0.06496813 SomeGraphicalA IRP_MJ_CREATE VCP0 SUCCESS Options: Open 27 0.00000244 SomeGraphicalA IRP_MJ_CLEANUP VCP0 SUCCESS 28 5.09932105 SomeGraphicalA IRP_MJ_CLOSE VCP0 SUCCESS 29 5.03467199 SomeGraphicalA IRP_MJ_CREATE VCP0 SUCCESS Options: Open 30 0.00000279 SomeGraphicalA IOCTL_SERIAL_GET_BAUD_RATE VCP0 SUCCESS 31 0.00000105 SomeGraphicalA IOCTL_SERIAL_GET_LINE_CONTROL VCP0 SUCCESS 32 0.00000105 SomeGraphicalA IOCTL_SERIAL_GET_CHARS VCP0 SUCCESS 33 0.00000070 SomeGraphicalA IOCTL_SERIAL_GET_HANDFLOW VCP0 SUCCESS 34 0.00000105 SomeGraphicalA IOCTL_SERIAL_GET_BAUD_RATE VCP0 SUCCESS 35 0.00000070 SomeGraphicalA IOCTL_SERIAL_GET_LINE_CONTROL VCP0 SUCCESS 36 0.00000070 SomeGraphicalA IOCTL_SERIAL_GET_CHARS VCP0 SUCCESS 37 0.00000035 SomeGraphicalA IOCTL_SERIAL_GET_HANDFLOW VCP0 SUCCESS 38 0.00027194 SomeGraphicalA IOCTL_SERIAL_SET_BAUD_RATE VCP0 SUCCESS Rate: 9600 39 0.00051770 SomeGraphicalA IOCTL_SERIAL_CLR_RTS VCP0 SUCCESS 40 0.00028835 SomeGraphicalA IOCTL_SERIAL_SET_DTR VCP0 SUCCESS 41 0.00030022 SomeGraphicalA IOCTL_SERIAL_SET_LINE_CONTROL VCP0 SUCCESS StopBits: 1 Parity: NONE WordLength: 8 42 0.00000140 SomeGraphicalA IOCTL_SERIAL_SET_CHAR VCP0 SUCCESS EOF:0 ERR:0 BRK:0 EVT:0 XON:11 XOFF:13 43 0.00018118 SomeGraphicalA IOCTL_SERIAL_SET_HANDFLOW VCP0 SUCCESS Shake:1 Replace:0 XonLimit:2048 XoffLimit:512 44 0.00000105 SomeGraphicalA IOCTL_SERIAL_GET_TIMEOUTS VCP0 SUCCESS 45 0.00000105 SomeGraphicalA IOCTL_SERIAL_SET_TIMEOUTS VCP0 SUCCESS RI:-1 RM:0 RC:0 WM:0 WC:0 46 0.00019828 SomeGraphicalA IOCTL_SERIAL_SET_WAIT_MASK VCP0 SUCCESS Mask: RXCHAR 47 116.59613788 SomeGraphicalA IOCTL_SERIAL_WAIT_ON_MASK VCP0 CANCELLED 48 0.03208767 SomeGraphicalA IRP_MJ_WRITE VCP0 * 0xC0000001 Length 7: 10 03 00 03 00 01 77 49 0.00000209 SomeGraphicalA IRP_MJ_CLEANUP VCP0 SUCCESS 50 0.00000000 SomeGraphicalA IRP_MJ_CLOSE VCP0
The first time it was working like a charm, I've sent two requests on COM port (lines 22-23). I closed the program, took some break, restarted it and the problem is back (line 48. On line 50 we see that COM port hangs on closing).
That's a PortMon's log. -
Hi,
What kind of serial port is the device you use ?
-
@SGaist
This is USB Serial Port, produced by FTDI, with the latest drivers I've managed to find on official website.
It is actually a USB to RS-485 converter, but it maps as COM port in OS (truestory, it is being correctly shown as COM9 under the section 'COM and LPT ports' in device manager). -
Perhaps try another program to see if your COM port hangs the same way, Windows XP had a free program called HyperTerminal, you can download a free 30-day trial for you Windows 7 here
@hskoglund
Thank you for your answer. I've found that PuTTY.exe (another connection soft) also has capability to send bytes to COM port. And everything worked like a charm (in putty, sure). Here's a fragment of my testing:5 0.01122259 putty.exe IRP_MJ_CREATE VCP0 SUCCESS Options: Open 46 0.00000279 putty.exe IOCTL_SERIAL_GET_BAUD_RATE VCP0 SUCCESS 47 0.00000105 putty.exe IOCTL_SERIAL_GET_LINE_CONTROL VCP0 SUCCESS 48 0.00000105 putty.exe IOCTL_SERIAL_GET_CHARS VCP0 SUCCESS 49 0.00000070 putty.exe IOCTL_SERIAL_GET_HANDFLOW VCP0 SUCCESS 50 0.00000105 putty.exe IOCTL_SERIAL_GET_BAUD_RATE VCP0 SUCCESS 51 0.00000035 putty.exe IOCTL_SERIAL_GET_LINE_CONTROL VCP0 SUCCESS 52 0.00000035 putty.exe IOCTL_SERIAL_GET_CHARS VCP0 SUCCESS 53 0.00000035 putty.exe IOCTL_SERIAL_GET_HANDFLOW VCP0 SUCCESS 54 0.00026182 putty.exe IOCTL_SERIAL_SET_BAUD_RATE VCP0 SUCCESS Rate: 9600 55 0.00015604 putty.exe IOCTL_SERIAL_SET_RTS VCP0 SUCCESS 56 0.00013091 putty.exe IOCTL_SERIAL_SET_DTR VCP0 SUCCESS 57 0.00021015 putty.exe IOCTL_SERIAL_SET_LINE_CONTROL VCP0 SUCCESS StopBits: 1 Parity: NONE WordLength: 8 58 0.00000105 putty.exe IOCTL_SERIAL_SET_CHAR VCP0 SUCCESS EOF:0 ERR:0 BRK:0 EVT:0 XON:11 XOFF:13 59 0.00019165 putty.exe IOCTL_SERIAL_SET_HANDFLOW VCP0 SUCCESS Shake:1 Replace:40 XonLimit:2048 XoffLimit:512 60 0.00000105 putty.exe IOCTL_SERIAL_SET_TIMEOUTS VCP0 SUCCESS RI:1 RM:0 RC:0 WM:0 WC:0 61 52.21592939 putty.exe IRP_MJ_READ VCP0 CANCELLED Length 1 62 0.00016268 putty.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: H 63 0.00022097 putty.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: e 64 0.00021225 putty.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: l 65 0.00033792 putty.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: l 66 0.00029114 putty.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: o 67 0.00021120 putty.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: 68 0.00026950 putty.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: W 69 0.00033024 putty.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: o 70 0.00019409 putty.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: r 71 0.00031488 putty.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: l 72 0.00020422 putty.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: d 73 0.00014732 putty.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: l 74 0.00020177 putty.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: l 75 0.00025239 putty.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: l 76 0.00033513 putty.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: . 77 0.00000349 putty.exe IRP_MJ_CLEANUP VCP0 SUCCESS 78 0.11307382 putty.exe IRP_MJ_CLOSE VCP0 SUCCESS
Everything seems to be the same, but putty does not send IOCTL_SERIAL_SET_WAIT_MASK and IOCTL_SERIAL_WAIT_ON_MASK commands, which QT does
Maybe because of this signal my port hangs. Is there any way to control such behavior?
-
@hskoglund
Thank you for your answer. I've found that PuTTY.exe (another connection soft) also has capability to send bytes to COM port. And everything worked like a charm (in putty, sure). Here's a fragment of my testing:5 0.01122259 putty.exe IRP_MJ_CREATE VCP0 SUCCESS Options: Open 46 0.00000279 putty.exe IOCTL_SERIAL_GET_BAUD_RATE VCP0 SUCCESS 47 0.00000105 putty.exe IOCTL_SERIAL_GET_LINE_CONTROL VCP0 SUCCESS 48 0.00000105 putty.exe IOCTL_SERIAL_GET_CHARS VCP0 SUCCESS 49 0.00000070 putty.exe IOCTL_SERIAL_GET_HANDFLOW VCP0 SUCCESS 50 0.00000105 putty.exe IOCTL_SERIAL_GET_BAUD_RATE VCP0 SUCCESS 51 0.00000035 putty.exe IOCTL_SERIAL_GET_LINE_CONTROL VCP0 SUCCESS 52 0.00000035 putty.exe IOCTL_SERIAL_GET_CHARS VCP0 SUCCESS 53 0.00000035 putty.exe IOCTL_SERIAL_GET_HANDFLOW VCP0 SUCCESS 54 0.00026182 putty.exe IOCTL_SERIAL_SET_BAUD_RATE VCP0 SUCCESS Rate: 9600 55 0.00015604 putty.exe IOCTL_SERIAL_SET_RTS VCP0 SUCCESS 56 0.00013091 putty.exe IOCTL_SERIAL_SET_DTR VCP0 SUCCESS 57 0.00021015 putty.exe IOCTL_SERIAL_SET_LINE_CONTROL VCP0 SUCCESS StopBits: 1 Parity: NONE WordLength: 8 58 0.00000105 putty.exe IOCTL_SERIAL_SET_CHAR VCP0 SUCCESS EOF:0 ERR:0 BRK:0 EVT:0 XON:11 XOFF:13 59 0.00019165 putty.exe IOCTL_SERIAL_SET_HANDFLOW VCP0 SUCCESS Shake:1 Replace:40 XonLimit:2048 XoffLimit:512 60 0.00000105 putty.exe IOCTL_SERIAL_SET_TIMEOUTS VCP0 SUCCESS RI:1 RM:0 RC:0 WM:0 WC:0 61 52.21592939 putty.exe IRP_MJ_READ VCP0 CANCELLED Length 1 62 0.00016268 putty.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: H 63 0.00022097 putty.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: e 64 0.00021225 putty.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: l 65 0.00033792 putty.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: l 66 0.00029114 putty.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: o 67 0.00021120 putty.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: 68 0.00026950 putty.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: W 69 0.00033024 putty.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: o 70 0.00019409 putty.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: r 71 0.00031488 putty.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: l 72 0.00020422 putty.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: d 73 0.00014732 putty.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: l 74 0.00020177 putty.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: l 75 0.00025239 putty.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: l 76 0.00033513 putty.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: . 77 0.00000349 putty.exe IRP_MJ_CLEANUP VCP0 SUCCESS 78 0.11307382 putty.exe IRP_MJ_CLOSE VCP0 SUCCESS
Everything seems to be the same, but putty does not send IOCTL_SERIAL_SET_WAIT_MASK and IOCTL_SERIAL_WAIT_ON_MASK commands, which QT does
Maybe because of this signal my port hangs. Is there any way to control such behavior?
And here is the log fragment for HyperTerm.
79 0.01420278 hypertrm.exe IRP_MJ_CREATE VCP0 SUCCESS Options: Open 80 0.00000663 hypertrm.exe IOCTL_SERIAL_SET_QUEUE_SIZE VCP0 SUCCESS InSize: 8192 OutSize: 8192 81 0.00000105 hypertrm.exe IOCTL_SERIAL_CONFIG_SIZE VCP0 SUCCESS Size: 0 82 0.00000105 hypertrm.exe IOCTL_SERIAL_GET_BAUD_RATE VCP0 SUCCESS 83 0.00000105 hypertrm.exe IOCTL_SERIAL_GET_LINE_CONTROL VCP0 SUCCESS 84 0.00000244 hypertrm.exe IOCTL_SERIAL_GET_CHARS VCP0 SUCCESS 85 0.00000105 hypertrm.exe IOCTL_SERIAL_GET_HANDFLOW VCP0 SUCCESS 86 0.00000070 hypertrm.exe IOCTL_SERIAL_GET_BAUD_RATE VCP0 SUCCESS 87 0.00000070 hypertrm.exe IOCTL_SERIAL_GET_LINE_CONTROL VCP0 SUCCESS 88 0.00000070 hypertrm.exe IOCTL_SERIAL_GET_CHARS VCP0 SUCCESS 89 0.00000070 hypertrm.exe IOCTL_SERIAL_GET_HANDFLOW VCP0 SUCCESS 90 0.00024576 hypertrm.exe IOCTL_SERIAL_SET_BAUD_RATE VCP0 SUCCESS Rate: 9600 91 0.00027927 hypertrm.exe IOCTL_SERIAL_SET_RTS VCP0 SUCCESS 92 0.00015220 hypertrm.exe IOCTL_SERIAL_SET_DTR VCP0 SUCCESS 93 0.00018781 hypertrm.exe IOCTL_SERIAL_SET_LINE_CONTROL VCP0 SUCCESS StopBits: 1 Parity: NONE WordLength: 8 94 0.00000105 hypertrm.exe IOCTL_SERIAL_SET_CHAR VCP0 SUCCESS EOF:0 ERR:0 BRK:0 EVT:0 XON:11 XOFF:13 95 0.00021469 hypertrm.exe IOCTL_SERIAL_SET_HANDFLOW VCP0 SUCCESS Shake:80000001 Replace:80000040 XonLimit:80 XoffLimit:200 96 0.00000105 hypertrm.exe IOCTL_SERIAL_SET_TIMEOUTS VCP0 SUCCESS RI:10 RM:0 RC:0 WM:0 WC:5000 97 0.00020911 hypertrm.exe IOCTL_SERIAL_SET_WAIT_MASK VCP0 SUCCESS Mask: RLSD ERR 98 149.25617403 hypertrm.exe IOCTL_SERIAL_WAIT_ON_MASK VCP0 SUCCESS 99 149.25617263 hypertrm.exe IRP_MJ_READ VCP0 CANCELLED Length 80 100 0.00033059 hypertrm.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: H 101 0.00029254 hypertrm.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: e 102 0.00028695 hypertrm.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: l 103 0.00032465 hypertrm.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: l 104 0.00018048 hypertrm.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: o 105 0.00016966 hypertrm.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: 106 0.00026391 hypertrm.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: T 107 0.00020073 hypertrm.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: h 108 0.00036096 hypertrm.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: e 109 0.00016407 hypertrm.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: r 110 0.00016791 hypertrm.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: e 111 0.00023215 hypertrm.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: N 112 0.00025868 hypertrm.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: o 113 0.00017315 hypertrm.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: t 114 0.00022726 hypertrm.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: 115 0.00030860 hypertrm.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: H 116 0.00021399 hypertrm.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: a 117 0.00016756 hypertrm.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: n 118 0.00019968 hypertrm.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: g 119 0.00018223 hypertrm.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: i 120 0.00031069 hypertrm.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: n 121 0.00019444 hypertrm.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: g 122 0.00021748 hypertrm.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: ? 123 0.00026147 hypertrm.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: W 124 0.00034351 hypertrm.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: e 125 0.00029149 hypertrm.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: l 126 0.00016407 hypertrm.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: l 127 0.00011171 hypertrm.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: H 128 0.00000349 hypertrm.exe IOCTL_SERIAL_GET_COMMSTATUS VCP0 SUCCESS 129 0.00024227 hypertrm.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: e 130 0.00000140 hypertrm.exe IOCTL_SERIAL_GET_COMMSTATUS VCP0 SUCCESS 131 0.00020457 hypertrm.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: r 132 0.00000175 hypertrm.exe IOCTL_SERIAL_GET_COMMSTATUS VCP0 SUCCESS 133 0.00027718 hypertrm.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: e 134 0.00000175 hypertrm.exe IOCTL_SERIAL_GET_COMMSTATUS VCP0 SUCCESS 135 0.00024052 hypertrm.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: 136 0.00000175 hypertrm.exe IOCTL_SERIAL_GET_COMMSTATUS VCP0 SUCCESS 137 0.00031279 hypertrm.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: c 138 0.00000209 hypertrm.exe IOCTL_SERIAL_GET_COMMSTATUS VCP0 SUCCESS 139 0.00021469 hypertrm.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: o 140 0.00000175 hypertrm.exe IOCTL_SERIAL_GET_COMMSTATUS VCP0 SUCCESS 141 0.00020771 hypertrm.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: m 142 0.00000140 hypertrm.exe IOCTL_SERIAL_GET_COMMSTATUS VCP0 SUCCESS 143 0.00019968 hypertrm.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: e 144 0.00000175 hypertrm.exe IOCTL_SERIAL_GET_COMMSTATUS VCP0 SUCCESS 145 0.00021644 hypertrm.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: s 146 0.00000140 hypertrm.exe IOCTL_SERIAL_GET_COMMSTATUS VCP0 SUCCESS 147 0.00020980 hypertrm.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: 148 0.00000175 hypertrm.exe IOCTL_SERIAL_GET_COMMSTATUS VCP0 SUCCESS 149 0.00020806 hypertrm.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: t 150 0.00000140 hypertrm.exe IOCTL_SERIAL_GET_COMMSTATUS VCP0 SUCCESS 151 0.00020806 hypertrm.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: h 152 0.00000175 hypertrm.exe IOCTL_SERIAL_GET_COMMSTATUS VCP0 SUCCESS 153 0.00022481 hypertrm.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: e 154 0.00000140 hypertrm.exe IOCTL_SERIAL_GET_COMMSTATUS VCP0 SUCCESS 155 0.00020911 hypertrm.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: 156 0.00000140 hypertrm.exe IOCTL_SERIAL_GET_COMMSTATUS VCP0 SUCCESS 157 0.00020596 hypertrm.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: l 158 0.00000209 hypertrm.exe IOCTL_SERIAL_GET_COMMSTATUS VCP0 SUCCESS 159 0.00020247 hypertrm.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: i 160 0.00000175 hypertrm.exe IOCTL_SERIAL_GET_COMMSTATUS VCP0 SUCCESS 161 0.00021364 hypertrm.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: n 162 0.00000175 hypertrm.exe IOCTL_SERIAL_GET_COMMSTATUS VCP0 SUCCESS 163 0.00021295 hypertrm.exe IRP_MJ_WRITE VCP0 SUCCESS Length 1: e 164 0.00021609 hypertrm.exe IOCTL_SERIAL_SET_WAIT_MASK VCP0 SUCCESS Mask: RLSD ERR 165 0.00000733 hypertrm.exe IOCTL_SERIAL_PURGE VCP0 SUCCESS Purge: TXABORT RXABORT 166 0.00000279 hypertrm.exe IRP_MJ_CLEANUP VCP0 SUCCESS 167 0.11072793 hypertrm.exe IRP_MJ_CLOSE VCP0 SUCCESS 168 0.00965866 hypertrm.exe IRP_MJ_CREATE VCP0 SUCCESS Options: Open 169 0.00000175 hypertrm.exe IRP_MJ_QUERY_INFORMATION VCP0 SUCCESS -1567238140 170 0.00000209 hypertrm.exe IRP_MJ_CLEANUP VCP0 SUCCESS 171 0.11427330 hypertrm.exe IRP_MJ_CLOSE VCP0 SUCCESS
Probably those IOCTLs are not the reason, because hyperterm sends them too.
Should I send the data in a single symbol at a time, instead of sending data packages? I'm going to connect to device using a binary protocol and my message contains non-ascii chars (0x00 are pretty common in my messages). -
- You can try to open serial port in WriteOnly mode, in this case the RXCHA flag will not be set (if it confuses you).
- You can try to use the Terminal example from QSP examples.
Also, please provide an error code and error text if it happens!
As I remember, the Putty does not work with serial port in overlapped mode. Also I'm not sure that the HyperTerm also works in overlapped mode (as I can see from your log).
PS: History shows, that the FTDI adapter never had problems on Windows. Maybe your PortMon get stuck, maybe latest FTDI drivers get stuck.. Maybe you need to change your HW to another FTDI adapter (as current may broken).
-
I need not only write bytes but I need to be able to read them from port as defined in the task. Hardware does not belong to me, so I have to work with the provided devices.
The code works unreliably, sometimes it works, sometimes it does not.
That's weird.