Я использую следующий код, чтобы открыть последовательный порт для связи с 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);
}
После этого я пытаюсь прочитать из соединения, используя следующий код:
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;
}
Чтение делает не время ожидания истекло после ожидания в течение 10 секунд.
Однако, когда я открываю и закрываю последовательный монитор внутри arduino-ide перед запуском моего кода QT, это работает. Я предполагаю, что ardunio-ide делает что-то с портом, который мне не хватает, но, насколько я могу судить, я использую те же настройки, что и arduino-ide, чтобы открыть последовательный порт.
Это код, который работает на Arduino:
void setup()
{
Serial.begin(115200);
Serial.write(RDY);
}
это У парня была похожая проблема, и он сравнил настройки последовательного порта putty и QSerialPort. Он обнаружил, что настройки fDtrControl
, fOutX
а также fIutX
различались. Я пытался изменить fDtrControl
но это не имело никакого эффекта. Я не знаю, как установить fOutX
а также fIutX
используя QT.
Есть идеи, что может быть причиной этой ошибки?
редактировать:
Решение: port.setDataTerminalReady(true)
скучал
Я не знаю, как установить fOutX и fIutX с помощью QT.
Пожалуйста, прочитайте мой ответ в Вот.
Также убедитесь, что конфигурация Putty (или вашего arduino-терминала) (четность, управление потоком, скорость передачи) совпадает с конфигурацией QSerialPort. Кроме того, вы можете попробовать пример Terminal (из примеров QtSerialPort), например, вместо Putty (или вашего ардуино-терминала).
UPD:
Вы можете попробовать добавить:
setDataTerminalReady(true);
а также
setRequestToSend(true);
после открытия порта.