Сигнал QIODevice::bytesWritten(), Точнее, интересует, как работает запись в QSerialPort |
Здравствуйте, гость ( Вход | Регистрация )
Сигнал QIODevice::bytesWritten(), Точнее, интересует, как работает запись в QSerialPort |
Анна |
1.11.2013, 10:08
Сообщение
#1
|
Активный участник Группа: Участник Сообщений: 276 Регистрация: 22.5.2008 Из: Зеленоград Пользователь №: 181 Спасибо сказали: 30 раз(а) Репутация: 4 |
Ситуация: записываю в порт большой массив длиной N, и жду сигнала bytesWritten(qint64).
Вопрос: что делать, если сигнал вернёт значение M, меньшее N? 1. ждать , когда прийдёт сигнал о записи остатка? 2. повторно записать остаток массива N-M? (Например, это случай, когда N превысила размер буфера порта) |
|
|
gormih |
1.11.2013, 10:33
Сообщение
#2
|
Студент Группа: Новичок Сообщений: 15 Регистрация: 22.9.2011 Пользователь №: 2901 Спасибо сказали: 0 раз(а) Репутация: 0 |
Ситуация: записываю в порт большой массив длиной N, и жду сигнала bytesWritten(qint64). Вопрос: что делать, если сигнал вернёт значение M, меньшее N? 1. ждать , когда прийдёт сигнал о записи остатка? 2. повторно записать остаток массива N-M? (Например, это случай, когда N превысила размер буфера порта) Если остаток размера буфера порта меньше вашей записи - принципиально не рекомендуется в него "толкать" такие записи. Лучше делать это постепенно. Для более подробного освещения данного вопроса рекомендуется посмотреть исходники используемой Вами библиотеки. Такая ситуация из за того, что в первую очередь uart как правило очень медленный, и напихать в него больше чем он может "перемолоть" очень и очень легко. Вы можете сформировать свой динамический буфер, в который толкать все что угодно, а из него уже в fifo. При этом вся ответсвенность за переполнение данного буфера ложиться на ваши плечи. |
|
|
Анна |
1.11.2013, 12:03
Сообщение
#3
|
Активный участник Группа: Участник Сообщений: 276 Регистрация: 22.5.2008 Из: Зеленоград Пользователь №: 181 Спасибо сказали: 30 раз(а) Репутация: 4 |
Если остаток размера буфера порта меньше вашей записи - принципиально не рекомендуется в него "толкать" такие записи. Лучше делать это постепенно. Для более подробного освещения данного вопроса рекомендуется посмотреть исходники используемой Вами библиотеки. Такая ситуация из за того, что в первую очередь uart как правило очень медленный, и напихать в него больше чем он может "перемолоть" очень и очень легко. Вы можете сформировать свой динамический буфер, в который толкать все что угодно, а из него уже в fifo. При этом вся ответсвенность за переполнение данного буфера ложиться на ваши плечи. В том-то и дело, что QSerialPort "кушает" т в свой внутренний буфер столько, сколько ему дают. А вот , что происходит, когда виндовая функция записи внутри порта вернула значение, меньшее, чем мы в неё отправили, это понять из исходного кода тяжеловато, а на эксперименты времени не хватает. Варриантов не много - либо порт извиняется и говорит, что не смог запихнуть в железку больше, либо извещает меня сигналами, по мере того как скармливает данные из своего буфера. Очень хочется надеяться, что второе. Сообщение отредактировал Анна - 1.11.2013, 12:03 |
|
|
kuzulis |
1.11.2013, 17:09
Сообщение
#4
|
Активный участник Группа: Участник Сообщений: 393 Регистрация: 29.6.2009 Пользователь №: 862 Спасибо сказали: 36 раз(а) Репутация: 7 |
1. Пихать можно сколько угодно путем write()
2. Данные передаются автоматически кусками по 512 байт. 3. После реальной отправки каждого куска (ну, или остатка меньшего чем 512), излучается bytesWritten() Пример:
|
|
|
Litkevich Yuriy |
2.11.2013, 13:03
Сообщение
#5
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
1. ждать , когда прийдёт сигнал о записи остатка? угу.Я обычно завожу таймер (время вычисляю исходя из скорости передачи), а затем подсчитываю сколько уже отправлено, каждый раз при приходе сигнала о передаче, таймер сбрасываю. Далее, если таймер сработал - что-то пошло не так и данные вовремя не переданы, если отправлено всё до сработки таймера - Ок. |
|
|
Анна |
7.11.2013, 13:46
Сообщение
#6
|
Активный участник Группа: Участник Сообщений: 276 Регистрация: 22.5.2008 Из: Зеленоград Пользователь №: 181 Спасибо сказали: 30 раз(а) Репутация: 4 |
kuzulis, спасибо за информацию. Из из текста документации это место не совсем понятно. Мало того, write возвращает всегда то число байт, которое в него положили, что несколько сбивает с толку, так как в документации написано, что возвращает количество "were actually written".
Litkevich Yuriy, так и сделала. Сообщение отредактировал Анна - 7.11.2013, 13:54 |
|
|
Текстовая версия | Сейчас: 28.11.2024, 18:06 |