QSerialDevice - Библиотека для работы с COM-портами |
Здравствуйте, гость ( Вход | Регистрация )
QSerialDevice - Библиотека для работы с COM-портами |
silver47 |
8.2.2011, 14:06
Сообщение
#201
|
Активный участник Группа: Участник Сообщений: 356 Регистрация: 1.4.2010 Пользователь №: 1584 Спасибо сказали: 40 раз(а) Репутация: 6 |
дак наверное буфер порта имеет только 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 |
|
|
|
kuzulis |
8.2.2011, 19:17
Сообщение
#203
|
Активный участник Группа: Участник Сообщений: 393 Регистрация: 29.6.2009 Пользователь №: 862 Спасибо сказали: 36 раз(а) Репутация: 7 |
Порт виртуальный - ELTIMA Virtual Serial Port. Самый хороший из всех эмуляторов! Имхо. Порты, созданные другими программами (например, Virtual Serial Ports Emulator) не определяются этой библиотекой. Как понял, определяются только те порты, которые есть в диспетчере устройств в ветке "Порты LPT и COM". А где те, которые создаются Virtual Serial Ports Emulator не знаю. Так и должно быть. Программа, написанная другим человеком, на делфне читает всё полностью. Может можно как-то последовательно прочитать? В ELTIMA Virtual Serial Port Driver включите эмуляцию baudrate и будет счастье. |
|
|
silver47 |
8.2.2011, 19:41
Сообщение
#204
|
Активный участник Группа: Участник Сообщений: 356 Регистрация: 1.4.2010 Пользователь №: 1584 Спасибо сказали: 40 раз(а) Репутация: 6 |
В ELTIMA Virtual Serial Port Driver включите эмуляцию baudrate и будет счастье. На реальном железе это не вылезет? Тогда еще вопрос, как получать состояние линий, в примере только про DSR и CTS. За библиотеку спасибо, мне кажется более логичной и удобной чем qextSerialDevice. |
|
|
kuzulis |
8.2.2011, 19:47
Сообщение
#205
|
Активный участник Группа: Участник Сообщений: 393 Регистрация: 29.6.2009 Пользователь №: 862 Спасибо сказали: 36 раз(а) Репутация: 7 |
На реальном железе это не вылезет? Нет, не вылезет, я только что проверил (на всякий случай). Тогда еще вопрос, как получать состояние линий, в примере только про 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 |
Какую максимальную скорость передачи данных Вам удавалось получить? Я передаю в компьютер пакеты по 9 байт. С интервалом 200 мс между пакетами. Если быстрее- программа подвисает. Программа сама по себе не большая и не сложная. Какие есть способы повысить скорость приема данных? 1. Насчет скорости - зависит от типа UART , т.е. у разных м/сх (контроллеров и т.п.) разные верхние планки бод. 2. Самый "простой" способ - это использовать потоки (threads). ЗЫ: Я только что сам попробовал на скорости 9600 бод передавать ~20 байт с интервалом ~10 мс и подтверждаю, тормозит . Я посмотрю что можно предпринять (если будет время) , может что-то в коде библиотеки не то, может еще что, а может иные причины, а может так и должно быть. ЗЫЗЫ: Должно помочь редактирование файла nativeserialengine_win.cpp (если вы используете винду). Нужно найти метод qint64 NativeSerialEnginePrivate::nativeWrite(const char *data, qint64 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).
|
|
|
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 и не факт что оно возвратит реальное кол-во записанных байт. Поэтому всё нафик удаляем и считаем что сколько байт записали - столько и записалось! Иного способа (кроме потоков) я не вижу. Цитата Я, конечно, попробую Ваш совет, но не думаю что дело в этом. В этом, в этом... Не сомневайтесь. Я проверил. ЗЫ: Все-таки придется наверное что-то с этим делать. |
|
|
Текстовая версия | Сейчас: 1.12.2024, 14:10 |