Russian Qt Forum
Ноябрь 25, 2024, 00:37 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QtSerialPort - устройство отвечает не сразу  (Прочитано 6162 раз)
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);
}
 
Записан
Bepec
Гость
« Ответ #1 : Июль 20, 2012, 14:23 »

Ооо, работа с ком портом Веселый

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

А тот кусок кода, что ты выложил - явно недостаточен Улыбающийся Один timeout = 1000 меня настораживает.

PS можно сказать работа с комом у меня каждый день 12/7. И QtSerialPort работает как часики Улыбающийся
Записан
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #2 : Июль 20, 2012, 14:59 »

Сейчас придет kuzulis, и скажет, что вначале открываем  порт, потом его конфигурируем )
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
Bepec
Гость
« Ответ #3 : Июль 20, 2012, 15:01 »

Ухыхы "D

Возможно, возможно Веселый
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #4 : Июль 20, 2012, 15:13 »

Сейчас придет kuzulis, и скажет, что вначале открываем  порт, потом его конфигурируем )

Истину глаголишь! Улыбающийся
Записан

ArchLinux x86_64 / Win10 64 bit
Alex_C
Гость
« Ответ #5 : Июль 20, 2012, 15:17 »

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

Код:
  { Установить новые настройки порта }
  SetCommState(FHandle, dcb);
  { Сбрасываем приемный и передающий buffers }
  PurgeComm(FHandle, PURGE_TXCLEAR or PURGE_RXCLEAR);
  { Устанавливаем размеры buffers }
  SetupComm(FHandle, FInBufSize, FOutBufSize);
Записан
Alex_C
Гость
« Ответ #6 : Июль 20, 2012, 15:18 »

Как это?Непонимающий
Сначала открыть ком-порт, а потом конфигурить?Непонимающий?
Записан
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #7 : Июль 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;
}
Так )
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
Alex_C
Гость
« Ответ #8 : Июль 20, 2012, 15:27 »

Блииин! Улыбающийся
Сейчас внимательно посмотрел свои и Ваши исходники - да все одно и тоже!!! Улыбающийся
Просто я сначала конфигурацию ком-порта запоминал, потом
CreateFile
потом
ApplyComSettings;
!!!
И совсем забыл об этом!
Большое спасибо!!!!!!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.11 секунд. Запросов: 22.