ардуино увеличить буфер обмена
- Войдите на сайт для отправки комментариев
Пт, 18/09/2020 - 21:46
Добрый день. Подскажите пожалуйста.
Необходимо передать большую строку в саму ардуино. У меня ардуино принимает максимум 63 символа ...
при этом скорость выставил на 500000 бод. если выставить 9600 - то ардуино примет меньше символов.
На ардуино УНО возможно увеличить буфер обмена ? Если нет то в каких модификациях это возможно?
В интернете нашел такой алгоритм
В папке с Arduino IDE ищем файл SoftwareSerial.h и внутри ищем строку #define _SS_MAX_RX_BUFF 64. В не то и меняем цифру 64 на желаемую, но не больше 255.
проделал не помогло ...
Подскажите пожалуйста как увеличить буфер обмена ?
Спасибо за любую помощь ...
не хотел создавать несколько тем ... браузер подвис ... извинясюь ...
1. насколько надо увеличить?
2. Зачем его увеличивать - вычитывайте по мере поступления и ничего увеличивать не надо
Ну судя по тому, что буфер обмена вы уже увеличили, а это вам не помогло, то дело, скорее всего, не буфере обмена.
Давайте ваш код сюда и объяснения как именно он не работает.
Добрый день. Подскажите пожалуйста.
Необходимо передать большую строку в саму ардуино. У меня ардуино принимает максимум 63 символа ...
при этом скорость выставил на 500000 бод.
Показывайте весь код целиком, я подобным кодом принимаю ответы от вебсерверов длиной сотни и тысячи байт
ТС, если у вас мега 328, то при операциях с большими строками, ОЗУ может не хватить.
DEL
код с помощью которого я отправляю прост
но проблема в том что у меня получилось передать арудино только 63 символа и все (((.
Давайте, Вы сначала научитесь отличать отправку от получения. В данном коде ничего не отправляется - это код для чтения из порта, а не для отправки в него.
Повторяю во второй раз. Для того чтобы отправить, допустим, мегабайт, вовсе не нужно заводить буфер на мегабайт. Отправляйте то, что Вам нужно по частям, а не всё за одну операцию.
/////В папке с Arduino IDE ищем файл SoftwareSerial.h и .....
////
Serial
.available()) {
2
char
inChar =
Serial
.read();
И здаётся мне что это несколько разные сириалы. Вам вообще какой из них жмет в размере?
volodya3d - вы точно код правильный прислали? он вообще работать не должен
Если я совсем не ослеп, у вас блок с 72 по 140 строчку выполняется ДЛЯ КАЖДОГО принятого символа?
А что касается того, что у вас мессдж обрезается - так похоже дело в том, что у вас просто не хватает динамической памяти для увеличения типа String. У вас крайне неээфективный код, куча стрингов, которые вы бесконечно выделяете и никогда не чистите...
Уверен, что буфер приема Сериал тут не причем - тут "всю систему менять надо"
Очередная жертва мифа 'ардуино это просто'.
Беда :(
- я понял. С помощью SoftwareSerial.h мы отправляем с ардуино на модуль сим900. Да я тупанул ...
- Вот где я такое сказал ??? Вы прямо с первого раза все понимали когда начинали ??? Начинаю вникать в ардуино. Да тупанул, объекты разные.
- да я понял. Тупанул.
- Количество данных читаемых ардуино из порта как то можно регулировать ? как то можно увеличить ?
Если читать по мере поступления, то нет никаких ограничений, кроме объёма памяти на разбор пришедшего. Если ждать пока заполнится буфер, то размер буфера определяет количество данных. Вообще это неправильная постановка вопроса. Количество прочитанных данных данных определяется только программой. Ардуина читает всё. До бесконечности. Ваша программа должна полученные данные обрабатывать по мере поступления, а не ждать, пока буфер заполнится. Буфер нужен на время, пока ардуина отвлекается на другие задачи. В любом случае скорость прихода символов на много меньше скорости обработки.
volodya3d, у вас проблемы в фундаментальных знаниях и опыте программирования МК, вы начните с задачи попроще.
Сказано же выше, не надо пытаться все вычитать с порта. Задайте поиск по интернету чтение о обработка данных sim800 online - сотни примеров.
Володя, вы опять ничего не поняли. Вам не надо посылать данные частями, суть в том, чтобы обрабатывать данные по мере поступления.
Я еще раз приведу пример с приемом ответа от вебсервера - вебсервер шлет непрерывно сотни и тысячи строк - тут никакого буфера не хватит и сервер не попросишь подождать
Тем не менее, я легко примаю ардуиной ответ от гугля и выделяю из него нужную информацию. Секрет в том, чтобы обрабатывать данные, как только они приняты
А ваши вопросы сколько символов вы можете принять за раз - показывают что вы думаете совсем в неправильном направлении. Ответ на ваш вопрос - принять из сериала можно сколько угодно - хоть 100 символов, хоть 1000 .... и буфер тут непричем
- Количество данных читаемых ардуино из порта как то можно регулировать ? как то можно увеличить ?
Ардуино вообще ничего не читает. Читаете Вы (Ваша программа). Как напишете, так и читать будет.
ТС, чтобы написать годную программу нужно серьезно разобраться в действии каждой функции, например таких как Serial.read(), Serial.available() и т.д. Не нужно угадывать и писать наобум (сам так делал в свое время и ничего хорошего не вышло). Уж так повелось, что без теории в программировании никуда. Нужно все же что-нибудь почитать. В интернете про это много инфы.
И да, читать данные от модема нужно не за один проход луп.
Примеры с обработкой online
http://arduino.ru/forum/apparatnye-voprosy/vse-o-sim800l-i-vse-chto-s-ni...
http://arduino.ru/forum/apparatnye-voprosy/vse-o-sim800l-i-vse-chto-s-ni...
http://arduino.ru/forum/apparatnye-voprosy/vse-o-sim800l-i-vse-chto-s-ni...
Уважаемые andycat, MaksVV, ЕвгенийП, b707, nik182 и другие спасибо за помощь.
- да я так и сделал и все заработало ... я разбил сообщение отправляемые в порт на 4 и принимал их почастям. и теперь все работает ... я сделал вот так вот -
и у меня все заработало ... чему я несказанно рад ...
Спасибо за помощь форумчане !!!
Может я не правильно формулирую вопрос - но поробуйте пожалуйста ответить ... понимая что я на начальном уровне ...
допустим я могу отправить в ком порт символ 1, и ардуино прочитает этот символ и вернет мне его .. могу отправить и 1111111111 (десять едениц) и ардуино прочитает все эти символы и вернет мне обратно ...
А могу я отправить 100 едениц ? могу 1000 ??? Единожды ??? чем ограничивается количество символов ???
Хоть мильен. При приеме данных надо опираться на какие то рамки. Т.е. информацию разбивать на пакеты. В случае с модемом это строки, которые заканчиваются символами перевода строки и каретки. Это ключевые символы, по которым определяется конец строки (пакета). Ищите в сети примеры работы с сим800. За каждый проход лупа , если в буфере Сериал порта есть новый полученный символ , он читается и добавляется к вашей получаемой строке. И так делаем пока не получим конец строки. Дак вот ваш вопрос более справедлив не к размеру буфера сериал порта, а к размеру вами созданного буфера для сбора строки. Его вы сами определяете (размер массива символов).
А отправлять то как бы и вообще не надо буфера сериал порта, отсылаете да и все , хоть сколько байт. Другое дело, откуда вы этот объем байт будете брать. Размер этого объема ( а скорее всего он будет лежать у вас в ОЗУ) и будет определяющим.
- уважаемый Макс ничего подобного если написать простой скетч в цикле луп
и ввести в мониторинг порта большую строку - то не все данные выведет обратно ардуино ...
Почему ???
ЗЫ для своего скетча я решение нашел ... дело не в этом ... мне просто для понимания ...
- то есть если посмотреть на скетч выше количество байт определяется размером ОЗУ так ? правильно я понял? или опять туплю ???
Сильно не пинайте я же новичок ...
Тупите. Вам уже десять человек сказали одно и то же - а до вас все не доходит. То, сколько вы можете ПРИНЯТЬ символов - зависит от СПОСОБА ПРИЕМА,а не от способа отправки. Разделив свой пакет данных на части, вы пошли неверным путем.
Если в вашем тестовом коде добавить внешний цикл вокруг while() - будет приниматься все, сколько бы вы не отправили.
Володя, проделайте простой эксперимент- возьмите свой код из сообщения 26 ( да-да, вот эти три строчки) и поместите их в loop. Только их, все остальное из лупа уберите.
Если теперь вы будете посылать ардуине ваши строки - вы увидите, что принимаются любые, и короткие и длинные
- то есть если посмотреть на скетч выше количество байт определяется размером ОЗУ так ? правильно я понял? или опять туплю ???
Сильно не пинайте я же новичок ...
Вы не правильно поняли. Вам толдычут, что нельзя забивать озу полностью. Я не очень внимательно топик читал, но вроде вы хотите собирать пду сообщения для отправки на модем? Дак вот вообще не проблема отправить много байт на модем. Проблема их гдето правильно хранить, ведь откуда то вы же их собрались отправлять?дак вот как вы их храните - это куча String ов, забьет любое озу. И тут проблемы будут уже не с отправкой байт, а вообще с выполнением и стабильностью работы программы. Глюки могут быть непомерные, вплоть до перезагрузки МК. Выше сказанное касается именно отправки байт. Потому как вы похоже не разделяете эти понятия прием и отправку. Ваши ошибки при получении байт уже выше в постах описаны
- уважаемый Макс ничего подобного если написать простой скетч в цикле луп
и ввести в мониторинг порта большую строку - то не все данные выведет обратно ардуино ...
Почему ???
А вообще, Вы не с той стороны подходите. Нужно интересоваться не "сколько байт можно отправить" а "какое время эта оправка замет". Последовательный порт - медленное устройство, а Вы пытаетесь программировать его так, как будто оно работает мгновенно.