Передача данных пакетами
- Войдите на сайт для отправки комментариев
Вс, 16/09/2018 - 14:52
Всем привет!
Подсткажите, есть данные (беру из файла), я хочу их передать пакетами размером sizeBlock в UART.
void sendUART (int index, int sizeBlock) { if (mcuFlash.available()) { while(ждем конец пакета) { // Читаем байт // Передаем в UART // Смещаем index // Проверяем чтоб не передали больше чем sizeBlock } } }
Я так представляю, что нужно передавать в функцию индекс начала пакета и длинну.
Передавать пакет, сохранять начало для следующего пакета и так до конца.
Как это сделать?
А чем не устраивает штатная функция write? Зачем огород-то городить?
Serial.write(buf, len)
Я не очень понимаю как ей пользоваться, длину я передам (это sizeBlock), а как мне куски этих данных туда вставить? Они ведь сплошняком идут. Мне как то нужно запоминать до куда я передал, выйти из функции и потом снова зайти и передавать уже с конца предыдущего куска.
Я сейчас передаю побайтно, а хочу пакетами
И еще момент, как в конце передачи быть, если размер не кратен размеру блока.
Первый параметр - адрес начала, второй - сколько байтов передавать - передавайте сколько хотите.
И еще момент, как в конце передачи быть, если размер не кратен размеру блока.
зависит от того , насколько чуствительна принимающая сторона к размерности блока < sizeBlock
Должно быть так?
Кому должно? Откуда нам значть что Вам нужно? Что нужно, то и должно.
Кому должно? Откуда нам значть что Вам нужно? Что нужно, то и должно.
Грубиян ))
Мне нужно файл прошивки передать по 128 Байт в UART.
На той стороне стоит загрузчик, который принимает по 128 Байт, как примет - запишет страницу во флешь и ответит, типа давай следующий пакет 128 Байт.
Не получается у меня пакеты сформировать, не знаю как... Вот и обратился за ПОМОЩЬЮ, а не пустым недовольствием...
Арифметика же простая: сколько раз пакет размером N вместится в данные размером M, с учётом остатка? можете решить эту задачу?
Я Вам сказал какой функцией нужно пользоваться. Вы это игнорируете и пишете какие-то глупости со строками, что Вам ещё сказать. А если в Вашем пакете 0 попадётся - как Ваша String на него прореагирует?
Могу взять размер файла mcuFlash.size() и поделить на размер блока (128), получу число полных блоков... но что это даст?
Я не знаю как указать начало 2, 3... блоков
Могу взять размер файла mcuFlash.size() и поделить на размер блока (128), получу число полных блоков... но что это даст?
Я не знаю как указать начало 2, 3... блоков
Это - тоже арифметика: если в массиве данных размером М есть n блоков размером N при условии, что первый блок N располагается по адресу 0, вопрос: по какому адресу будет располагаться второй блок? третий? если блок имеет размерность N?
1 - 0+N,
2 - N + N
3 - 2N + N
У меня получилось это
Ну, не знаю, без цельного кода ничего не скажешь. Так, на вид, похоже на бред, но тут код целиком смотреть надо.
1 - 0+N,
2 - N + N
3 - 2N + N
У меня получилось это
Вопрос на засыпку: что написано в документации к Serial.write? Что возвращает mcuFlash.read ? Вы вызываете Serial.write с одним параметром, следовательно - туда плюнется ОДИН байт.
Согласен) не работает!
Приближенно код тако:
Опять неправильно. Ещё раз: что возвращает mcuFlash.read? Именно это значение вы пытаетесь вывести в UART.
mcuFlash.read(pos, sizePack) должен вернуть кусок данных от pos длиной sizePack
Кому должен? Никому он не должен возвращать никакого куска данных. Откройте, наконец, библиотеку и посмотрите,что он возвращает.
Я не понимаю, смотрел это https://www.arduino.cc/en/Reference/FileRead
что не так?
Я не понимаю, смотрел это https://www.arduino.cc/en/Reference/FileRead
что не так?
Returns
The next byte (or character), or -1 if none is available.
Вопросы?
Значит, она возвращает 1 очередной Байт из файла. Значит мне нужно вызвать ее 128 раз и сделать счетчик позиции?
Да, если читать побайтово. Можно читать блоками, но пока, для простоты понимания - можно в цикле побайтово.
Вроде это заработало.
А куда дальше смотреть?
Дальше - по потребностям. Отправлять по блокам в Serial - уже вышло. Правда, без контроля ошибок ;) Внимательно читали документацию? Что возвратит read, если уже нет в файле данных, т.е. - достигнут конец файла при чтении? В этом случае вы всё равно 128 раз отправите не существующие в файле данные.
Да, отправляет 128 Байт и сбрасывается флаг контроля потока (uartFlowCtrl), потом я с терминала шлю xOn и продолжается передача еще 128 Байт
Да, отправляет 128 Байт и сбрасывается флаг контроля потока (uartFlowCtrl), потом я с терминала шлю xOn и продолжается передача еще 128 Байт
Я не про это. Допустим, в файле 150 байт. Поскольку вы нигде не анализируете значение, возвращаемое read - сколько байт вы отправите вашим кодом, если надо отправить весь файл, двумя пакетами, максимальный размер пакета - 128 байт?
Размер будет зависить от используемого микроконтроллера, в момент загрузки загрузчика, он отправляет размер пакета и ардуина начинает слать такие пакеты.
Нет. ещё раз: ваш код НЕ анализирует тот факт, что из файла уже всё прочитано.
Сделал контроль наличия данных файла, работает
Ну вот, уже лучше. posInFile не нужна, поскольку вы нигде не используете перемещение позиции чтения с файла, а просто читаете последовательно - внутри File уже и так хранится курсор позиции чтения.
Сделал, спасибо Огромное!
А как читать сейчас блоками или не стоит этого делать?
Если устраивает, как сделано - пока забейте. Потом - потихонку осилите. Читать блоками - в read передавать указатель на буфер и размер буфера, вызов read вернёт, сколько вычитано в буфер. Далее этот буфер скармливаем Serial.write, с указанием, сколько в буфере данных (что вернул вызов блочного варианта read).
Что то очень сложно это... я планирую BIN передавать, он максимум 20к, думаю оставлю пока как есть
Спасибо за помощь!!!
Возьму на заметку описание выше, буду экспериментировать, если скорость не устроит.
Добрый день уважаемые знатоки!
Помогите пожалуйста нубу разобраться. Есть измерительное устройство, которое при измерении посылает пакет данных с результатами измерения в COM порт компьютера.
Пакеты эти, вот такого формата, если смотреть в терминале:
55 83 0C 13 51 5F 43 03 00 00 2D AA
В этом пакете содержаться три числа - 21.39 , 4945 и 0
Разработчик прибора оставил информацию о том, как можно выполнить преобразование и вытащить эти цифры из пакета, но к сожалению, спустя 3 дня после всяческих шаманств так ничего путнего у меня и не вышло.
Вот что оставил разработчик:
Помогите пожалуйста, буду очень признателен.
Если сами не можете написать - обращайтесь в раздел "Ищу исполнителя". Там вам сделают за недорого. Тут могут помочь найти ошибку в коде, в коде который вы не написали.