I am using the following code to open a serial port to communicate with the arduino.
const qint32 baud = Global::getInstance().getSettings().value("Hardware/baudRate", 115200).toInt();
const QString portName = Global::getInstance().getSettings().value("Hardware/port", "COM3").toString();
port.setPortName(portName);
if(!port.open(QIODevice::ReadWrite))
{
qFatal("Unable to open serial port");
exit(1);
}
if(!port.setParity(QSerialPort::NoParity) ||
!port.setStopBits(QSerialPort::OneStop) ||
!port.setDataBits(QSerialPort::Data8) ||
!port.setFlowControl(QSerialPort::NoFlowControl ) ||
!port.setBaudRate(baud))
{
qFatal("Unable to configure serial port");
exit(1);
}
if(port.error() != QSerialPort::NoError)
{
qFatal("some error occurred!");
exit(1);
}
Afterwards I try to read from the connection using the following code:
bool Light::waitForReady()
{
char data[1];
data[0] = -1;
if(port.waitForReadyRead(10000))
{
const int numRead = port.read(&data[0], 1);
if(numRead == 1)
{
return data[0] == (char)RDY;
}
else
{
qWarning("Read error, read %d bytes", numRead);
}
}
else
{
qWarning("Read timeout");
return false;
}
return false;
}
The read does not work, it times out after waiting for 10 seconds. However when I open and close the serial monitor inside the arduino-ide before running my QT code it works. My guess is that the ardunio-ide does something to the port that I am missing but as far as I can tell I am using the exact same settings as the arduino-ide to open the serial port.
This is the code that is running on the arduino:
void setup()
{
Serial.begin(115200);
Serial.write(RDY);
}
This guy has had a similar problem and he compared the serial port settings of putty and QSerialPort. He found that the settings fDtrControl
, fOutX
and fIutX
differed. I tried changing fDtrControl
but it had no effect. I do not know how to set fOutX
and fIutX
using QT.
Any ideas what might be causing this bug?
edit:
Solution: port.setDataTerminalReady(true)
was missing
I do not know how to set fOutX and fIutX using QT.
Please read my answer is in here.
Also be convinced that the Putty (or your arduino-terminal) configuration (parity, flow control, baud rate) are same as QSerialPort configuration. In addition, you can try the Terminal example (from the QtSerialPort examples), e.g. instead of Putty (or your arduino-terminal).
UPD:
You can try to add:
setDataTerminalReady(true);
and
setRequestToSend(true);
after opening of port.