Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Alex_C от Июль 20, 2012, 14:19



Название: QtSerialPort - устройство отвечает не сразу
Отправлено: Alex_C от Июль 20, 2012, 14:19
Есть ус-во подсоединенное к компу через ком-порт.
Включаем компьютер, запускаем программу мониторинга ком-портов.
Запускаю свою программу на Qt (использую в ней QtSerialPort). На устройстве загорается лампочка - есть связь с компом.
Посылаю команды на устройство - устройство молчит.
Мониторю, какие команды посылаются через ком- порт - все верно.
Выхожу из программы на Qt, загружаю свою старую программу на Деньфи - все сразу работает.
Выхожу из программы на Дельфи, загружаю на Qt - и она начинает работать.
Проверял - установки ком-порта в обоих программах одинаковые.
Подскажите, в каком направлении копать?

Ком-порт на Qt открываю так:

Код
C++ (Qt)
bool RigThread::configurePort(QSettings &s)
{
   bool Ok;
   m_port = new SerialPort(s.value("COMPort", "COM1").toString());
   m_port->setRate(s.value("BaudRate", 57600).toInt(&Ok));
   m_port->setDataBits(SerialPort::DataBits(s.value("DataBits", 8).toInt(&Ok)));
   m_port->setParity(SerialPort::Parity(s.value("Parity", 0).toInt(&Ok)));
   m_port->setStopBits(SerialPort::StopBits(s.value("StopBits", 1).toInt(&Ok)));
   m_port->setFlowControl(SerialPort::FlowControl(s.value("FlowControl", 0).toInt(&Ok)));
   m_port->setDtr(s.value("DTR", false).toBool());
   m_port->setRts(s.value("RTS", false).toBool());
   connect(m_port, SIGNAL(readyRead()), this, SLOT(slot_readDataFromPort()));
 
   m_poolInterval = s.value("PoolInterval", 50).toInt(&Ok);
   m_timeOut = s.value("Timeout", 1000).toInt(&Ok);
 
   return m_port->open(QIODevice::ReadWrite);
}
 


Название: Re: QtSerialPort - устройство отвечает не сразу
Отправлено: Bepec от Июль 20, 2012, 14:23
Ооо, работа с ком портом :D

Мониторь трафик любой программой. И увидишь, шлёт твоя программа что-либо, или не шлёт.

А тот кусок кода, что ты выложил - явно недостаточен :) Один timeout = 1000 меня настораживает.

PS можно сказать работа с комом у меня каждый день 12/7. И QtSerialPort работает как часики :)


Название: Re: QtSerialPort - устройство отвечает не сразу
Отправлено: Kurles от Июль 20, 2012, 14:59
Сейчас придет kuzulis, и скажет, что вначале открываем  порт, потом его конфигурируем )


Название: Re: QtSerialPort - устройство отвечает не сразу
Отправлено: Bepec от Июль 20, 2012, 15:01
Ухыхы "D

Возможно, возможно :D


Название: Re: QtSerialPort - устройство отвечает не сразу
Отправлено: kuzulis от Июль 20, 2012, 15:13
Сейчас придет kuzulis, и скажет, что вначале открываем  порт, потом его конфигурируем )

Истину глаголишь! :)


Название: Re: QtSerialPort - устройство отвечает не сразу
Отправлено: Alex_C от Июль 20, 2012, 15:17
Так это на заметку - с ком-портом работаю уже очень давно и много. На дельфи работа с ком-портом была написана с 0 на WinAPI - никаких компонентов. Так что - "просто мониторь" - тут не катит :)
Конечно уже все промониторил.
И компонент QtSerialPort выбрал, т.к. сначала его исходники посмотрел (виндовые конечно). Очень хорошо все написано!
По этому работа QtSerialPort под сомнение здесь даже не ставится!
И порт конфигурить нужно ДО открытия ком-порта.
Тут просто такой момент - может перед открытием порт нужно "сбросить"?
Сейчас смотрю свои исходники - я там перед открытием ком-порта делал

Код:
  { Установить новые настройки порта }
  SetCommState(FHandle, dcb);
  { Сбрасываем приемный и передающий buffers }
  PurgeComm(FHandle, PURGE_TXCLEAR or PURGE_RXCLEAR);
  { Устанавливаем размеры buffers }
  SetupComm(FHandle, FInBufSize, FOutBufSize);


Название: Re: QtSerialPort - устройство отвечает не сразу
Отправлено: Alex_C от Июль 20, 2012, 15:18
Как это????
Сначала открыть ком-порт, а потом конфигурить?????


Название: Re: QtSerialPort - устройство отвечает не сразу
Отправлено: Kurles от Июль 20, 2012, 15:20
Как это????
Сначала открыть ком-порт, а потом конфигурить?????
Код
C++ (Qt)
bool RigThread::configurePort(QSettings &s)
{
   bool Ok;
   m_port = new SerialPort(s.value("COMPort", "COM1").toString());
   bool retVal = m_port->open(QIODevice::ReadWrite);
   m_port->setRate(s.value("BaudRate", 57600).toInt(&Ok));
   m_port->setDataBits(SerialPort::DataBits(s.value("DataBits", 8).toInt(&Ok)));
   m_port->setParity(SerialPort::Parity(s.value("Parity", 0).toInt(&Ok)));
   m_port->setStopBits(SerialPort::StopBits(s.value("StopBits", 1).toInt(&Ok)));
   m_port->setFlowControl(SerialPort::FlowControl(s.value("FlowControl", 0).toInt(&Ok)));
   m_port->setDtr(s.value("DTR", false).toBool());
   m_port->setRts(s.value("RTS", false).toBool());
   connect(m_port, SIGNAL(readyRead()), this, SLOT(slot_readDataFromPort()));
 
   m_poolInterval = s.value("PoolInterval", 50).toInt(&Ok);
   m_timeOut = s.value("Timeout", 1000).toInt(&Ok);
 
   return retVal;
}
Так )


Название: Re: QtSerialPort - устройство отвечает не сразу
Отправлено: Alex_C от Июль 20, 2012, 15:27
Блииин! :)
Сейчас внимательно посмотрел свои и Ваши исходники - да все одно и тоже!!! :)
Просто я сначала конфигурацию ком-порта запоминал, потом
CreateFile
потом
ApplyComSettings;
!!!
И совсем забыл об этом!
Большое спасибо!!!!!!