crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

44 страниц V  « < 23 24 25 26 27 > »   
Ответить в данную темуНачать новую тему
> QSerialDevice - Библиотека для работы с COM-портами
kuzulis
  опции профиля:
сообщение 8.4.2011, 20:35
Сообщение #241


Активный участник
***

Группа: Участник
Сообщений: 393
Регистрация: 29.6.2009
Пользователь №: 862

Спасибо сказали: 36 раз(а)




Репутация:   7  


Цитата(d2r @ 8.4.2011, 13:02) *
или как тогда слушать все порты в системе, если известно сколько портов открывать?

В смысле?
Открываем все порты которые нужно и слушаем...

QList<AbstractSerial *> portList;
AbstractSerial *port = new AbstractSerial(this);
connect(port, SIGNAL(readyRead()), this, SLOT(procRead()));
portList.append(port);


Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
d2r
  опции профиля:
сообщение 9.4.2011, 13:23
Сообщение #242


Новичок


Группа: Новичок
Сообщений: 7
Регистрация: 24.3.2011
Пользователь №: 2534

Спасибо сказали: 1 раз(а)




Репутация:   0  


дада точняк))) тупанул
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silver47
  опции профиля:
сообщение 11.4.2011, 16:17
Сообщение #243


Активный участник
***

Группа: Участник
Сообщений: 356
Регистрация: 1.4.2010
Пользователь №: 1584

Спасибо сказали: 40 раз(а)




Репутация:   6  


2 kuzulis
Доброго времени суток. Использую Вашу библиотеку для работы с COM. Устройство, к которому подключаюсь, работает на разных скоростях на прием и на отправку. Запрос отправляется на одной скорости, ответ принимается на другой. Столкнулся с такой проблемой: если после отправки запроса, сменить скорость, то до устройства доходит мусор. Пример в двух скринах. Повторить можно на физических COM портах. На виртуальных такого эффекта не наблюдал.
Код:
port->setDeviceName(COMPorts->currentText());
port->open(AbstractSerial::ReadWrite)
port->setBaudRate(AbstractSerial::BaudRate1200)
port->setDataBits(AbstractSerial::DataBits7)
port->setParity(AbstractSerial::ParityEven)
port->setStopBits(AbstractSerial::StopBits2)
port->setFlowControl(AbstractSerial::FlowControlOff)

port->setBaudRate(AbstractSerial::BaudRate300);

data.append(\"1234567890\");
port->write(data);

port->setBaudRate(AbstractSerial::BaudRate1200);


ОС: windows7, windowsXP
Qt 4.7.2

В чем может быть проблема? Спасибо.

COM1 - программа COM2 снифер на другом конце нульмодемного кабеля

Сообщение отредактировал silver47 - 11.4.2011, 16:36
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 11.4.2011, 16:31
Сообщение #244


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(silver47 @ 11.4.2011, 19:17) *
Столкнулся с такой проблемой: если после отправки запроса, сменить скорость, то до устройства доходит мусор.
нужно ждать завершения передачи и только потом менять скорость. Как это сделать в данной библиотеке я не знаю, нужно смотреть руководство
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silver47
  опции профиля:
сообщение 11.4.2011, 16:37
Сообщение #245


Активный участник
***

Группа: Участник
Сообщений: 356
Регистрация: 1.4.2010
Пользователь №: 1584

Спасибо сказали: 40 раз(а)




Репутация:   6  


Цитата(Litkevich Yuriy @ 11.4.2011, 18:31) *
нужно ждать завершения передачи и только потом менять скорость. Как это сделать в данной библиотеке я не знаю, нужно смотреть руководство


Да я так и предполагаю, поэтому выставлял задержки в разных местах. Документацию пролистал, не заметил подобного.

В документации нашёл метод waitForBytesWritten(int msec) - который на настоящий момент не реализован и есть сигнал bytesWritten(qint64). Соединил сигнал со слотом, в котором меняю скорость, ситуацию это не изменило :(.

UPD. Подобрал задержку руками на ту сторону 5 байт ушло нормально, прием - каша. То есть уже удаленное устройство начинает писать ответ сразу, еще до того как скорость поменяю.

Сообщение отредактировал silver47 - 11.4.2011, 19:03
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuzulis
  опции профиля:
сообщение 11.4.2011, 19:24
Сообщение #246


Активный участник
***

Группа: Участник
Сообщений: 393
Регистрация: 29.6.2009
Пользователь №: 862

Спасибо сказали: 36 раз(а)




Репутация:   7  


2 silver47

Цитата
В документации нашёл метод waitForBytesWritten(int msec) - который на настоящий момент не реализован

Реализован, но мной не опробован.
Реализован идентично тому-же методу из сокетов.
Цитата
есть сигнал bytesWritten(qint64)

На этот сигнал полагаться нельзя, т.к. оно может его слать в процессе передачи данных частями.
Т.е., к примеру отправили вы 100 байт, а оно может 10 раз по 10 байт этот сигнал емиттить.

---

1. Многое зависит от того с каким флагом открывали девайс: Unbuffered или нет.
2. Попробуйте открывать девайс c флагом Unbuffered и т.п.
3. ИМХО, лучше всего положиться на waitForBytesWritten() (может быть, придется его подправить и т.п.).

Я ничего конкретного не подскажу, т.к. не приходилось иметь дело с такими "фирдипёрсовыми" устройствами.
Если бы нужно было в Linux работать - то там проще: там есть методы для установки разных скоростей на прием/передачу,
а вот под виндой - увы.

В любом случае, пробуйте, разбирайтесь, отпишитесь о результатах и исправлениях кода библиотеки.

"Свежак" библиотеки тут: http://gitorious.org/qserialdevice/qserial...ce/trees/master

------

Хотя, может быть, даже лучше всё-таки полагаться на сигнал bytesWritten() , только контролируя кол-во переданных байт.
т.е. если нужно передать 100 байт, то мы подсчитываем в слоте (приконнекченом на bytesWritten) кол-во переданных от bytesWritten байт (суммируем их)
и если сумма равна 100 то меняем скорость.

Но всё-равно нужно проверять и экспериментировать.

Сообщение отредактировал kuzulis - 11.4.2011, 19:36
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
nn1317
  опции профиля:
сообщение 12.4.2011, 9:36
Сообщение #247


Новичок


Группа: Новичок
Сообщений: 2
Регистрация: 12.4.2011
Пользователь №: 2594

Спасибо сказали: 0 раз(а)




Репутация:   0  


доброе утро)
блин, была у меня версия 0.1 - всем устраивала, только у заказчиков она хронически не собиралась, а у меня самого видимо чуть постарее кутишка и мингв, так что я как то давно собрал и забыл как это сделал. так вот, тем у кого 64битная юбунта как у меня - я просто копировал длл-ку и все работало. а тут попался человек с 32х биткой.
все собираю как dll.

1. пробую собрать версию 0.1 - везде одинаковые ошибки:
abstractserial.cpp: In member function ‘QString AbstractSerial::deviceName() const’:
abstractserial.cpp:636: error: call of overloaded ‘QString(int)’ is ambiguous
/usr/include/qt4/QtCore/qstring.h:428: note: candidates are: QString::QString(const QByteArray&)
/usr/include/qt4/QtCore/qstring.h:426: note:                 QString::QString(const char*)
/usr/include/qt4/QtCore/qstring.h:727: note:                 QString::QString(const QString&)
/usr/include/qt4/QtCore/qstring.h:106: note:                 QString::QString(QChar)
/usr/include/qt4/QtCore/qstring.h:105: note:                 QString::QString(const QChar*)
abstractserial.cpp: In member function ‘QString AbstractSerial::baudRate() const’:
abstractserial.cpp:706: error: call of overloaded ‘QString(int)’ is ambiguous
/usr/include/qt4/QtCore/qstring.h:428: note: candidates are: QString::QString(const QByteArray&)
/usr/include/qt4/QtCore/qstring.h:426: note:                 QString::QString(const char*)
/usr/include/qt4/QtCore/qstring.h:727: note:                 QString::QString(const QString&)
/usr/include/qt4/QtCore/qstring.h:106: note:                 QString::QString(QChar)
/usr/include/qt4/QtCore/qstring.h:105: note:                 QString::QString(const QChar*)
abstractserial.cpp: In member function ‘QString AbstractSerial::dataBits() const’:
abstractserial.cpp:800: error: call of overloaded ‘QString(int)’ is ambiguous
/usr/include/qt4/QtCore/qstring.h:428: note: candidates are: QString::QString(const QByteArray&)
/usr/include/qt4/QtCore/qstring.h:426: note:                 QString::QString(const char*)
/usr/include/qt4/QtCore/qstring.h:727: note:                 QString::QString(const QString&)
/usr/include/qt4/QtCore/qstring.h:106: note:                 QString::QString(QChar)
/usr/include/qt4/QtCore/qstring.h:105: note:                 QString::QString(const QChar*)
abstractserial.cpp: In member function ‘QString AbstractSerial::parity() const’:
abstractserial.cpp:894: error: call of overloaded ‘QString(int)’ is ambiguous
/usr/include/qt4/QtCore/qstring.h:428: note: candidates are: QString::QString(const QByteArray&)
/usr/include/qt4/QtCore/qstring.h:426: note:                 QString::QString(const char*)
/usr/include/qt4/QtCore/qstring.h:727: note:                 QString::QString(const QString&)
/usr/include/qt4/QtCore/qstring.h:106: note:                 QString::QString(QChar)
/usr/include/qt4/QtCore/qstring.h:105: note:                 QString::QString(const QChar*)
abstractserial.cpp: In member function ‘QString AbstractSerial::stopBits() const’:
abstractserial.cpp:988: error: call of overloaded ‘QString(int)’ is ambiguous
/usr/include/qt4/QtCore/qstring.h:428: note: candidates are: QString::QString(const QByteArray&)
/usr/include/qt4/QtCore/qstring.h:426: note:                 QString::QString(const char*)
/usr/include/qt4/QtCore/qstring.h:727: note:                 QString::QString(const QString&)
/usr/include/qt4/QtCore/qstring.h:106: note:                 QString::QString(QChar)
/usr/include/qt4/QtCore/qstring.h:105: note:                 QString::QString(const QChar*)
abstractserial.cpp: In member function ‘QString AbstractSerial::flowControl() const’:
abstractserial.cpp:1082: error: call of overloaded ‘QString(int)’ is ambiguous
/usr/include/qt4/QtCore/qstring.h:428: note: candidates are: QString::QString(const QByteArray&)
/usr/include/qt4/QtCore/qstring.h:426: note:                 QString::QString(const char*)
/usr/include/qt4/QtCore/qstring.h:727: note:                 QString::QString(const QString&)
/usr/include/qt4/QtCore/qstring.h:106: note:                 QString::QString(QChar)
/usr/include/qt4/QtCore/qstring.h:105: note:                 QString::QString(const QChar*)
make: *** [../build/lib/qserialdevice/obj/abstractserial.o] Error 1

если в строке с первой ошибкой меняю "QString res(0);" на "QString res;" то он начинает ругаеться на переменную "d", которая через одну строчку от прошлой ошибки - "wasn't declared in this scope"

2. слил новую 0.4. не собираеться из коробки.
ошибки - ругаеться на TTYLocker, говорит методы начиная с checkPid(..), деструктора, getShortName(..) и тд - "multiply definition"

версии qt и gcc (g++) самые последние из того что в стандартных репозиториях юбунты.

подскажите плиз как собрать!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuzulis
  опции профиля:
сообщение 12.4.2011, 10:58
Сообщение #248


Активный участник
***

Группа: Участник
Сообщений: 393
Регистрация: 29.6.2009
Пользователь №: 862

Спасибо сказали: 36 раз(а)




Репутация:   7  


Не знаю, что у Вас за проблема.
У меня версия из мастера прекрасно собирается на 32х битном Linux Mint Debian Edition, а также 64x битном Arch-е.

Может быть, в qserialdeviceenumerator.pri нужно закомментировать:
Цитата
HEADERS += $$PWD/../qserialdevice/ttylocker.h
SOURCES += $$PWD/../qserialdevice/ttylocker.cpp


Цитата
подскажите плиз как собрать!

Берем BuildLibrary.pro и собираем.

ЗЫ: По v0.1.0 ничо не подскажу.

Сообщение отредактировал kuzulis - 12.4.2011, 10:59
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
nn1317
  опции профиля:
сообщение 12.4.2011, 11:27
Сообщение #249


Новичок


Группа: Новичок
Сообщений: 2
Регистрация: 12.4.2011
Пользователь №: 2594

Спасибо сказали: 0 раз(а)




Репутация:   0  


>Берем BuildLibrary.pro и собираем.
ну я CONFIG который был закомментил, а закомменченый раскомментил, чтобы была dll-версия.

>Может быть, в qserialdeviceenumerator.pri нужно закомментировать:
попробовал, только в обычном qserialdevice.pri - закомментил и собралось))
спасибо)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
niklep
  опции профиля:
сообщение 22.5.2011, 17:39
Сообщение #250


Новичок


Группа: Новичок
Сообщений: 6
Регистрация: 11.4.2011
Пользователь №: 2590

Спасибо сказали: 0 раз(а)




Репутация:   0  


Доброго времени суток. Есть проблема при использовании данной библиотеки. Я пишу с помощью write данные в порт. Получаю корректный ответ. Тут же снова пишу в порт. Получаю 2 ответа (сигнал readyRead срабатывает дважды): корректный и пустой. В третий раз получу корректный ответ и 2 пустых. И так далее. Для чтения данных с порта использую readAll(). Вот фрагмент кода:
QByteArray ComHandler::readFromPort()
{
    QByteArray qba;
    qDebug() << "bytesAvailable1 " << port->bytesAvailable();
    qba = port->readAll();
    qDebug() << "bytesAvailable2 " << port->bytesAvailable();
    return qba;
}

Вывод:
Writed info:  ati
bytesAvailable1  2
bytesAvailable2  -1
slotReadCom:  "
1.0

OK
"

Writed info:  ati
bytesAvailable1  1
bytesAvailable2  0
slotReadCom:  "
1.0

OK
"
bytesAvailable1  0
bytesAvailable2  0
slotReadCom:  ""

Writed info:  ati
bytesAvailable1  1
bytesAvailable2  -1
slotReadCom:  "
1.0

OK
"
bytesAvailable1  0
bytesAvailable2  0
slotReadCom:  ""
bytesAvailable1  0
bytesAvailable2  0
slotReadCom:  ""

Также отмечу, что для облегчения отладки хотел использовать bytesAvailable(), но его вывод меня только запутал...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

44 страниц V  « < 23 24 25 26 27 > » 
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


9 чел. читают эту тему (гостей: 9, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.11.2024, 21:56