![]() |
|
![]() ![]() ![]() |
|
daemonaz |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 160 Регистрация: 4.5.2008 Репутация: нет Всего: нет |
Я новичок в Qt, у меня цель написать код, который бы отправлял прошивку флеш микроконтроллера, подключенный к COM-порту, по протоколу Xmodem, я создал отдельный класс Xmodem, но не знаю как правильно было бы реализовать инкапсуляцию данных из файла в пакет xmodem, есть ли у кого нибудь готовая реализация? Буду благодарен если кто-нибудь посоветует куда посмотреть.. Вопрос вот в чем, я использую в качестве пакета QByteArray, куда инкапсулирую данные прочитанные из файла, но получилось у меня довольно громоздко из трех массивов: один -для данных, которые я извлек из файла, второй - для служебной информации пакета (SOH, num, ~num), затем слиянием двух массивов делаю третий и отправляю в COM-порт. Как сделать более компактно и быстро? Есть вариант с использованием сериализации DataStream, но не знаю как его использовать в данном случае
|
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 48 Всего: 135 |
Нормальное у тебя решение. Зачем тебе быстрее ? Передача по COM-порту всё равно на порядки медленнее, чем конкатинация двух массивов в третий.
А вот это не советую, т.к. QDataStream добавлет в поток свои данные. Вот, почитай эту тему -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
daemonaz |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 160 Регистрация: 4.5.2008 Репутация: нет Всего: нет |
borisbn, спасибо!
Вот что получилось
Покритикуйте плиз код, это мой первый скажем так проект в QT, и заодно вопрос, хочу вывести на экран содержимое буфера побайтово, а выводится почему то в 32-хразрядном виде 0xffffffA5, как сделать чтобы массив выводился именно побайтово в виде 0xA5? Спасибо |
|||
|
||||
bsa |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 24 Всего: 196 |
мне только непонятно, а почему ты не отправляешь заголовок напрямую модему, а пихаешь во временный буфер? Так, думаю, было бы значительно более эффективно. Аналогично и с данными, т.е. ты читаешь их непосредственно перед отправкой. В этом случае будет значительно проще выполнить повтор передачи при возникновении ошибки (достаточно будет в очередь пакетов добавить номер повторяемого).
QT = QuickTime. Не путай с Qt. По возможности не используй sprintf, а используй arg().
В твоем случае код подготовки к выводу можно переписать так:
Это сообщение отредактировал(а) bsa - 9.1.2012, 11:56 |
||||
|
|||||
daemonaz |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 160 Регистрация: 4.5.2008 Репутация: нет Всего: нет |
bsa, спасибо!
![]() |
|||
|
||||
daemonaz |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 160 Регистрация: 4.5.2008 Репутация: нет Всего: нет |
Мне нужно отправить через COM-порт заготовленный пакет, но с ожиданием подтверждения, по протоколу xmodem, и чтобы не висеть в бесконечном цикле ожидания подтверждения по таймауту я хотел бы реализовать это через поток, но не знаю как это можно сделать, буду благодарен если будет примерчик такого способа реализации.. Планируется использовать при передаче файла QProgressDialog, где-то читал что можно реализовать через поток. Буду благодарен за любую помошь.
|
|||
|
||||
kuzulis |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 154 Регистрация: 5.9.2007 Репутация: нет Всего: 1 |
Да не нужен тебе поток в этом случае, тем более, если не еще знаешь что это такое и как им пользоваться. Используй сигналы/слоты для этого + QTimer для ожидания ответа. Также рекомендуется использовать готовые библиотеки для I/O через Serial порты, т.к. не понятно как ты там реализуешь у себя I/O и т.п. -- Также вместо crc16_ccitt() можно использовать Qt-шные функции (они вроде тоже могут считать CRC по разным там полиномам). Это сообщение отредактировал(а) kuzulis - 12.1.2012, 23:11 |
|||
|
||||
daemonaz |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 160 Регистрация: 4.5.2008 Репутация: нет Всего: нет |
Я использую библиотеку QextSerialPort, я обратил внимание на сигнал void QIODevice::readyRead () , он реализован в waitForReadyRead(), не это имели ввиду? Только хотелось бы понять механизм работы этой функции, или там сидим пока не придет сигнал, или же можем выполнять другую работу пока сигнал приема не придет? под Qt-шной функцией имеете ввиду qChecksum()? А где инициализируется полином? Это сообщение отредактировал(а) daemonaz - 13.1.2012, 09:27 |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 24 Всего: 196 |
мне тоже интересно... |
|||
|
||||
daemonaz |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 160 Регистрация: 4.5.2008 Репутация: нет Всего: нет |
Я так понимаю это имеет смысль если реализованы отправка пакета и ожидание приема по отдельности, а если они в одной функции
А вообще сушествует ли готовый класс для работы с протоколом X-modem, Ymodem? |
|||
|
||||
kuzulis |
|
||||||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 154 Регистрация: 5.9.2007 Репутация: нет Всего: 1 |
Лучше эту https://gitorious.org/qserialdevice/qserial...ive-tarball/2.0
Нене, так делать не нужно, т.к. твой цикл while(1), затормозит/приостановит Qt-шный Event loop и у тебя будут тормоза GUI во время твоей транзакции.
В Qt их точно нету. Да и что ты подразумеваешь под готовым классом? Что он должен делать? ;)
Упс... Я думал что это запилили, судя по "утвердительным" высказываниям на форумах: http://developer.qt.nokia.com/forums/viewthread/13128 http://developer.qt.nokia.com/doc/note_rev...ns/136/229/view Значит я ошибся :( Это плохо, если нет такой возможности. Нужно запилить!!! ![]() Это сообщение отредактировал(а) kuzulis - 13.1.2012, 12:53 |
||||||||
|
|||||||||
daemonaz |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 160 Регистрация: 4.5.2008 Репутация: нет Всего: нет |
я как раз пытаю Вашу библиотеку, если Вы действительно его автор, а как надо правильно подкиньте идею.. |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 24 Всего: 196 |
daemonaz, открываешь порт (объект serial типа SerialPort). Открываешь файл (объект file типа QFile). Подключаешь сигнал readyRead к слоту readData (или как ты его назвал) твоего класса. Этот слот читает данные из порта при вызове. Теперь тебе необходимо отправить признак начала передачи и проинициализировать переменную - номер текущего блока.
Внутри readData ты читаешь данные из порта, на их основании принимаешь решение о дальнейших действиях. Если все нормально, ты посылаешь текущий блок, предварительно считав его в буфер. Или еще что-нибудь. Все. функция завершилась. Но когда придут очередные данные она снова будет вызвана. |
|||
|
||||
kuzulis |
|
||||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 154 Регистрация: 5.9.2007 Репутация: нет Всего: 1 |
вот идея:
т.е как то так:
Идея думаю ясна ![]() А вообще, такого рода задачи необходимо делать через State Machine, оно тогда будет нагляднее и меньше ошибок сделаешь, ИМХО Это сообщение отредактировал(а) kuzulis - 13.1.2012, 17:37 |
||||||
|
|||||||
daemonaz |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 160 Регистрация: 4.5.2008 Репутация: нет Всего: нет |
Спасибо, kuzulis, супер!
![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |