crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> Сигнал 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  


Цитата(Анна @ 1.11.2013, 11:08) *
Ситуация: записываю в порт большой массив длиной 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  


Цитата(gormih @ 1.11.2013, 10:33) *
Если остаток размера буфера порта меньше вашей записи - принципиально не рекомендуется в него "толкать" такие записи. Лучше делать это постепенно.
Для более подробного освещения данного вопроса рекомендуется посмотреть исходники используемой Вами библиотеки.

Такая ситуация из за того, что в первую очередь 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()

Пример:

// пишем в порт 1024 байта
write(1024);

// в этом случае сигнал bytesWritten() должен излучиться дважды по 512 байт


// пишем в порт 1025 байт
write(1025);

// в этом случае сигнал bytesWritten() должен излучиться трижды 512 + 512 + 1 байт
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 2.11.2013, 13:03
Сообщение #5


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

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

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




Репутация:   94  


Цитата(Анна @ 1.11.2013, 12:08) *
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
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


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




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