crossplatform.ru

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

44 страниц V  « < 19 20 21 22 23 > »   
Ответить в данную темуНачать новую тему
> QSerialDevice - Библиотека для работы с COM-портами
silver47
  опции профиля:
сообщение 8.2.2011, 14:06
Сообщение #201


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

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

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




Репутация:   6  


Цитата(Litkevich Yuriy @ 8.2.2011, 16:03) *
дак наверное буфер порта имеет только 4к, смотри в настройках драйвера устройства


Порт виртуальный - ELTIMA Virtual Serial Port. Порты, созданные другими программами (например, Virtual Serial Ports Emulator) не определяются этой библиотекой. Как понял, определяются только те порты, которые есть в диспетчере устройств в ветке "Порты LPT и COM". А где те, которые создаются Virtual Serial Ports Emulator не знаю. Но вопрос не в этом, а в том как получить все, что программа на другом конце записала в порт (~100 кб).

Программа, написанная другим человеком, на делфне читает всё полностью. Может можно как-то последовательно прочитать?

Windows 7; Qt 4.7

Сообщение отредактировал silver47 - 8.2.2011, 14:47
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 8.2.2011, 14:35
Сообщение #202


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

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

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




Репутация:   94  


Цитата(silver47 @ 8.2.2011, 16:06) *
Созданные другими программами не определяются этой библиотекой
не понял фразы
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuzulis
  опции профиля:
сообщение 8.2.2011, 19:17
Сообщение #203


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

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

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




Репутация:   7  


Цитата(silver47 @ 8.2.2011, 14:06) *
Порт виртуальный - ELTIMA Virtual Serial Port.

Самый хороший из всех эмуляторов! Имхо.

Цитата(silver47 @ 8.2.2011, 14:06) *
Порты, созданные другими программами (например, Virtual Serial Ports Emulator) не определяются этой библиотекой. Как понял, определяются только те порты, которые есть в диспетчере устройств в ветке "Порты LPT и COM". А где те, которые создаются Virtual Serial Ports Emulator не знаю.

Так и должно быть.

Цитата(silver47 @ 8.2.2011, 14:06) *
Программа, написанная другим человеком, на делфне читает всё полностью. Может можно как-то последовательно прочитать?

В ELTIMA Virtual Serial Port Driver включите эмуляцию baudrate и будет счастье.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silver47
  опции профиля:
сообщение 8.2.2011, 19:41
Сообщение #204


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

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

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




Репутация:   6  


Цитата(kuzulis @ 8.2.2011, 21:17) *
В ELTIMA Virtual Serial Port Driver включите эмуляцию baudrate и будет счастье.

На реальном железе это не вылезет?
Тогда еще вопрос, как получать состояние линий, в примере только про DSR и CTS. За библиотеку спасибо, мне кажется более логичной и удобной чем qextSerialDevice.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuzulis
  опции профиля:
сообщение 8.2.2011, 19:47
Сообщение #205


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

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

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




Репутация:   7  


Цитата(silver47 @ 8.2.2011, 19:41) *
На реальном железе это не вылезет?

Нет, не вылезет, я только что проверил (на всякий случай).

Цитата(silver47 @ 8.2.2011, 19:41) *
Тогда еще вопрос, как получать состояние линий, в примере только про DSR и CTS.

Эммм.. посмотрите пример в /test/guiapp , читайте документацию и т.п.

PS: возьмите из git текущую ветку master : http://gitorious.org/qserialdevice/qserial...-tarball/master
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
rcdimon
  опции профиля:
сообщение 18.2.2011, 15:31
Сообщение #206


Студент
*

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

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




Репутация:   0  


Какую максимальную скорость передачи данных Вам удавалось получить?

Я передаю в компьютер пакеты по 9 байт. С интервалом 200 мс между пакетами. Если быстрее- программа подвисает. Программа сама по себе не большая и не сложная. Какие есть способы повысить скорость приема данных?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuzulis
  опции профиля:
сообщение 18.2.2011, 16:48
Сообщение #207


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

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

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




Репутация:   7  


Цитата(rcdimon @ 18.2.2011, 15:31) *
Какую максимальную скорость передачи данных Вам удавалось получить?

Я передаю в компьютер пакеты по 9 байт. С интервалом 200 мс между пакетами. Если быстрее- программа подвисает. Программа сама по себе не большая и не сложная. Какие есть способы повысить скорость приема данных?

1. Насчет скорости - зависит от типа UART , т.е. у разных м/сх (контроллеров и т.п.) разные верхние планки бод.
2. Самый "простой" способ - это использовать потоки (threads).

ЗЫ: Я только что сам попробовал на скорости 9600 бод передавать ~20 байт с интервалом ~10 мс и подтверждаю, тормозит :).
Я посмотрю что можно предпринять (если будет время) , может что-то в коде библиотеки не то, может еще что, а может иные причины, а может так и должно быть. :)

ЗЫЗЫ: Должно помочь редактирование файла nativeserialengine_win.cpp (если вы используете винду).
Нужно найти метод qint64 NativeSerialEnginePrivate::nativeWrite(const char *data, qint64 len), всё в нем удалить и
оставить только это:
qint64 NativeSerialEnginePrivate::nativeWrite(const char *data, qint64 len)
{
    if (!clear_overlapped(&this->oWrite))
        return qint64(-1);

    ::DWORD writeBytes = 0;
    ::WriteFile(this->descriptor, (LPCVOID)data, (DWORD)len, &writeBytes, &this->oWrite);

    return len;
}

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
rcdimon
  опции профиля:
сообщение 18.2.2011, 20:58
Сообщение #208


Студент
*

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

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




Репутация:   0  


Я, конечно, попробую Ваш совет, но не думаю что дело в этом.

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

А, например, драйвер модема не тормозит и отлично принимает данные даже на самых высоких скоростях. Наверное следует попробовать отвязать GUI от работы с портом. Наверное в этом дело. Запускать в разных потоках.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 18.2.2011, 22:23
Сообщение #209


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

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




Репутация:   44  


kuzulis, этот метод должен возвращать реальное число записанных байт (writeBytes), а не то количество? которое хотели записать (len).

qint64 NativeSerialEnginePrivate::nativeWrite(const char *data, qint64 len)
{
    if (!clear_overlapped(&this->oWrite))
        return qint64(-1);

    ::DWORD writeBytes = 0;
    ::WriteFile(this->descriptor, (LPCVOID)data, (DWORD)len, &writeBytes, &this->oWrite);

    return len;
}

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuzulis
  опции профиля:
сообщение 18.2.2011, 22:36
Сообщение #210


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

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

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




Репутация:   7  


Цитата
kuzulis, этот метод должен возвращать реальное число записанных байт (writeBytes), а не то количество? которое хотели записать (len).

По идее да, это так. Но на практике из-за того что нам надо знать реально сколько байт записалось - нам придется дождаться завершения операции I/O - и только после этого мы сможем узнать сколько байт записали. А ожидание I/O (через WaitSingleObject/GetOverlappedResult) - это фризы !
Т.е. WriteFile возвращается немедленно - но не факт что оно возвратит True и не факт что оно возвратит реальное кол-во записанных байт.

Поэтому всё нафик удаляем и считаем что сколько байт записали - столько и записалось! Иного способа (кроме потоков) я не вижу.

Цитата
Я, конечно, попробую Ваш совет, но не думаю что дело в этом.

В этом, в этом... Не сомневайтесь. Я проверил.

ЗЫ: Все-таки придется наверное что-то с этим делать.

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 28.3.2024, 16:49