Поиск:

Ответ в темуСоздание новой темы Создание опроса
> инкапсуляция данных в пакет Xmodem 
:(
    Опции темы
daemonaz
Дата 14.1.2012, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 160
Регистрация: 4.5.2008

Репутация: нет
Всего: нет



Цитата(kuzulis @  13.1.2012,  17:24 Найти цитируемый пост)
А вообще, такого рода задачи необходимо делать через State Machine, оно тогда будет нагляднее и меньше ошибок сделаешь, ИМХО

А вот это уже интересно, я правда имел дело с микроконтроллером, там да, понятно, а в Qt есть вроде QstateMachine, не это имели ввиду?
PM MAIL   Вверх
kuzulis
Дата 14.1.2012, 13:13 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 5.9.2007

Репутация: нет
Всего: 1



Ну да. Сначала рисуешь на бумажке, какие должны быть состояния, переходы, что должно выполняться в каждом состоянии и т.п. а потом реализуеш на QStateMachine, сигналах/слотах.

Вот, раз пошла такая пьянка, советую еще это почитать: http://www.eventhelix.com/realtimemantra/p...tocol_layer.htm
Может поможет в осмыслении глубины глубин. smile

Это сообщение отредактировал(а) kuzulis - 14.1.2012, 13:13
PM MAIL   Вверх
daemonaz
Дата 25.1.2012, 08:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 160
Регистрация: 4.5.2008

Репутация: нет
Всего: нет



Вопрос к kuzulis по поводу библиотеки, я хочу вывести принятые данные на QPlainTextEdit, делаю с помошью сигнала  readyRead()
Почему то выводится не все содержимое, а кусками, кстати с QExtSerial у меня такого не было. Хотелось бы понять где ошибка? Может не успевает обрабатывать, нужен поток?

Код

// открытие порта
..
..
connect(m_port, SIGNAL(readyRead()), this, SLOT(slot_readData()));
..

void MainWindow::slot_readData()
{
    QTextCharFormat textCharFormat = ui->teLog->currentCharFormat();
    textCharFormat.setForeground(Qt::black);
    ui->teLog->setCurrentCharFormat(textCharFormat);
    ui->teLog->appendPlainText(m_port->readAll());
}




PM MAIL   Вверх
kuzulis
Дата 25.1.2012, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 5.9.2007

Репутация: нет
Всего: 1



Сигнал readyRead() сигнализирует о том, что имеется некоторое количество входящих данных, доступных для чтения.
Минимальное количество от 1 байта и больше.

Внутри, в классе SerialPort, при приходе данных, автоматически вызывается нативная (платформо-зависимая) функция чтения
данных, которая читает доступые в текущий момент данные в буфере UART и помещает их в кольцевой буфер класса.

При открытии порта, его дескриптор настраивается таким образом, чтобы все функции чтения возвращались немедленно,
т.е. читают то, что есть (или то чего нет) и сразу возвращают управлениене ожидая пока придут следующие данные.

Таким образом, если передаешь, скажем, 100 байт, то оно
будет читать это порциями, по N байт (где N - кол-во байт, успевших придти в UART).

Из этого всего следует, что метод readAll() вернет всё, что есть в внутреннем буфере класса!!!
т.е. это не значит, что вызвав readAll() ты получишь весь пакет данных целиком!

Это не ошибка, так и должно быть, всё успевает обработать, и поток не нужен (хотя, по хорошему нужен,
т.к. в текущей реализации при интенсивном обмене данными будет фризить GUI под виндой - да есть такой косячок).

Как сделать так, чтобы принимался весь пакет - тебе было дано решение выше, на первых страницах твоей темы.









Это сообщение отредактировал(а) kuzulis - 25.1.2012, 10:24
PM MAIL   Вверх
daemonaz
Дата 25.1.2012, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 160
Регистрация: 4.5.2008

Репутация: нет
Всего: нет



kuzulis, спасибо! на прием данных наконец-то вынес в поток, но проблема оставалась до сих пор, пока вместо readAll не взял read(count), все заработало.. Специфичная такая функция.. smile 
PM MAIL   Вверх
kuzulis
Дата 25.1.2012, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 5.9.2007

Репутация: нет
Всего: 1



Цитата

kuzulis, спасибо! на прием данных наконец-то вынес в поток, но проблема оставалась до сих пор, пока вместо readAll не взял read(count), все заработало.. Специфичная такая функция.. smile  

Да и  read(count) аналогично работает: если запрашиваешь кол-во данных, превышающее их реальное текущее значение в буфере - то сразу вернет только то что в буфере, а не count, также не будет ждать пока набегут все count. 

В принципе, readAll() и read(<стопицотмильеновбайт>) эквивалентны, за исключением того, что в readAll() происходит некий оверхед и она чуть медленнее работает.
PM MAIL   Вверх
tzirechnoy
Дата 25.1.2012, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 1
Всего: 16



А есть ли смысл писать свой xmodem, а не использовать бинарник sx из lrzsz?
PM MAIL   Вверх
daemonaz
Дата 30.1.2012, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 160
Регистрация: 4.5.2008

Репутация: нет
Всего: нет



tzirechnoy, я рад бы использовать их, сам пишу под Линух, но юзеры хотят на windows only.. 
PM MAIL   Вверх
tzirechnoy
Дата 30.1.2012, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 1
Всего: 16



Вы так говорите, будто lrzsz под windows мало.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0896 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.