ардуино увеличить буфер обмена

volodya3d
Offline
Зарегистрирован: 09.09.2020

Добрый день. Подскажите пожалуйста.

Необходимо передать большую строку в саму ардуино. У меня ардуино принимает максимум 63 символа ...

при этом скорость выставил на 500000 бод. если выставить 9600 - то ардуино примет меньше символов.

На ардуино УНО возможно увеличить буфер обмена ? Если нет то в каких модификациях это возможно?

В интернете нашел такой алгоритм 

В папке с Arduino IDE ищем файл SoftwareSerial.h и внутри ищем строку #define _SS_MAX_RX_BUFF 64. В не то и меняем цифру 64 на желаемую, но не больше 255.

проделал не помогло ... 

Подскажите пожалуйста как увеличить буфер обмена ? 

Спасибо за любую помощь ... 

 

volodya3d
Offline
Зарегистрирован: 09.09.2020

не хотел создавать несколько тем ... браузер подвис ... извинясюь ...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

1. насколько надо увеличить?

2. Зачем его увеличивать - вычитывайте по мере поступления и ничего увеличивать не надо

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Ну судя по тому, что буфер обмена вы уже увеличили, а это вам не помогло, то дело, скорее всего, не буфере обмена.

Давайте ваш код сюда и объяснения как именно он не работает.

 

SLKH
Offline
Зарегистрирован: 17.08.2015

volodya3d пишет:

Добрый день. Подскажите пожалуйста.

Необходимо передать большую строку в саму ардуино. У меня ардуино принимает максимум 63 символа ...

при этом скорость выставил на 500000 бод. 

WTF??

// Timings counted from gcc 4.8.2 output. This works up to 115200 on
// 16Mhz and 57600 on 8Mhz.
 
volodya3d
Offline
Зарегистрирован: 09.09.2020
ЕвгенийП, asam, SLKH спасибо что откликнулись. Спасибо !!!
 
SLKH пишет:
 
WTF??
 
// Timings counted from gcc 4.8.2 output. This works up to 115200 on
// 16Mhz and 57600 on 8Mhz.
- программа работает так же как и при 115200 или 9600 только можно больше символов передать в сериал порт.
- объясните пожалуйста что не так ???
 
ЕвгенийП пишет:
1. насколько надо увеличить?
- хотелось бы до 180 символов.
 
ЕвгенийП пишет:
2. Зачем его увеличивать - вычитывайте по мере поступления и ничего увеличивать не надо
asam пишет:
Ну судя по тому, что буфер обмена вы уже увеличили, а это вам не помогло, то дело, скорее всего, не буфере обмена.Давайте ваш код сюда и объяснения как именно он не работает.
 
- что прописывал в SoftwareSerial.h _SS_MAX_RX_BUFF 255 что не прописывал - от этого сериал порт не стал получать больше символов. проверял простым кодом
 
  while (Serial.available()) {
    char inChar = Serial.read();
    Serial.println(inChar);
  } 
Я хочу программно с помощью ардуино отправлять большие смс на русском ... 
Уважаемый andycat говорит что мне нужно писать код формирования PDU пакета в теле программы, я же хочу передавать уже готовые PDU пакеты, но даже если согласиться с andycat - мне нужно отправлять больше чем русских 63 символа в ардуино ...
 
код с помощью которого я отправляю прост
 
  while (Serial.available()) {
    char inChar = Serial.read();
    if (inChar != '\n') inStringCommand += inChar; 
  }
но проблема в том что у меня получилось передать арудино только 63 символа и все (((.
 
Я понимаюя что можно разбить на несколько блоков ... но это усложнит написание программы ... есть ли способ попроще ??? есть ли способ передать ардуино большую строку ???
 
Заране спасибо за помощь ...
 

 

 
b707
Offline
Зарегистрирован: 26.05.2017

Показывайте весь код целиком, я подобным кодом принимаю ответы от вебсерверов длиной сотни и тысячи байт

MaksVV
Offline
Зарегистрирован: 06.08.2015

ТС, если у вас мега 328, то при операциях с большими строками, ОЗУ может не хватить. 

volodya3d
Offline
Зарегистрирован: 09.09.2020
b707 пишет:
Показывайте весь код целиком, я подобным кодом принимаю ответы от вебсерверов длиной сотни и тысячи байт
- без проблем
#include <SoftwareSerial.h>                     // Библиотека програмной реализации обмена по UART-протоколу
SoftwareSerial SIM900(7, 8);                    // RX, TX

String _response = "";                          // Переменная для хранения ответа модуля
String inStringCommand;

String PDUlen = "";
String PDUPack = "";  

boolean responseReceived = false; 
boolean responsePositive = false;                 

void(* resetFunc) (void) = 0; // Reset MC function


void setup() {

  // Реле включающая СИМ900
  pinMode(3, OUTPUT);
  digitalWrite(3,1);

  Serial.begin(500000);                         // Скорость обмена данными с компьютером
  SIM900.begin(9600);                           // Скорость обмена данными с модемом
  Serial.println("Start!");    
     
  //TestSIM900();
  
  // Команды настройки модема при каждом запуске
  _response = sendATCommand("AT+CMGF=1;&W", true); // Включаем текстовый режима SMS (Text mode) и сразу сохраняем значение (AT&W)!
  Serial.println(_response);
  
  _response = sendATCommand("AT+CMGDA=\"DEL ALL\"", true); // Удалить все сообщения, чтобы не забивали память модуля
  Serial.println(_response);
  _response = sendATCommand("AT+CMEE=2", true); 
  Serial.println(_response);

  _response = sendATCommand("AT+CIPSHUT", true); 
  Serial.println(_response);

  _response = sendATCommand("AT+DDET=0", true); 
  Serial.println(_response);

  _response = sendATCommand("ATE1", true); 
  Serial.println(_response); 

  _response = sendATCommand("AT+CLIP=0", true);
  Serial.println(_response); 

  _response = sendATCommand("ATS0=0", true);
  Serial.println(_response); 

  _response = sendATCommand("ATV1", true);
  Serial.println(_response); 

  _response = sendATCommand("AT+CMEE=2", true);
  Serial.println(_response);            

  _response = sendATCommand("AT+CMGF=0", true); 
  Serial.println(_response);   

  _response = sendATCommand("AT+CSCLK=0", true);
  Serial.println(_response);       
  
  Serial.println("Finish ... setup");
  
}


void loop() {


  while (Serial.available()) {
    char inChar = Serial.read();
    if (inChar != '\n') inStringCommand += inChar; 
  
      //Serial.print("String: ");
      //Serial.println(inStringCommand);

      String StringCommand = ""; 
      StringCommand = inStringCommand.substring(0,1);  

      Serial.print("Command: ");
      Serial.println(StringCommand);
 
      if (StringCommand == "S")
      {
        String volumeSMS = ""; 
        volumeSMS = inStringCommand.substring(1,2);
        Serial.println("volumeSMS");
        Serial.println(volumeSMS);

        int intvolumeSMS = volumeSMS.toInt();    
         
        String numberSMS = ""; 
        numberSMS = inStringCommand.substring(2,3);
        Serial.println("numberSMS");
        Serial.println(numberSMS); 

        int intnumberSMS = numberSMS.toInt(); 

        String volumeOfNumbers = ""; 
        volumeOfNumbers = inStringCommand.substring(3,4);
        Serial.println("volumeOfNumbers");
        Serial.println(volumeOfNumbers);
        
        int intVolumeOfNumbers = volumeOfNumbers.toInt();

        //String PDUlen = ""; 
        PDUlen = inStringCommand.substring(4, 4 + intVolumeOfNumbers);
        Serial.println("PDUlen");
        Serial.println(PDUlen); 
        
        //String PDUPack = ""; 
        PDUPack = inStringCommand.substring(4 + intVolumeOfNumbers);
        Serial.println("PDUPack");
        Serial.println(PDUPack);  
        
        Serial.flush();

        // блок отправки СМС
        responseReceived = false;
        responsePositive = false;
        sendSMSinPDU(PDUlen, PDUPack);
        AnalizeResponseSMS();
        if (responsePositive == true) {
           Serial.println("Message was sent. OK"); //SMS SEND
           Serial.print("SS");    
        }
        else
        {
           Serial.println("Message was not sent. Error"); //SMS NOT SEND 
           Serial.print("NS");    
        };
        delay(10); 
        // блок отправки СМС
           
      }
               
      inStringCommand = ""; 
    }
  }




String sendATCommand(String cmd, bool waiting) {
  String _resp = "";                            // Переменная для хранения результата
  Serial.println(cmd);                          // Дублируем команду в монитор порта
  SIM900.println(cmd);                          // Отправляем команду модулю
  if (waiting) {                                // Если необходимо дождаться ответа...
    _resp = waitResponse();                     // ... ждем, когда будет передан ответ
    // Если Echo Mode выключен (ATE0), то эти 3 строки можно закомментировать
    if (_resp.startsWith(cmd)) {                // Убираем из ответа дублирующуюся команду
      _resp = _resp.substring(_resp.indexOf("\r", cmd.length()) + 2);
    }
    Serial.println(_resp);                      // Дублируем ответ в монитор порта
  }
  return _resp;                                 // Возвращаем результат. Пусто, если проблема
}

String waitResponse() {                         // Функция ожидания ответа и возврата полученного результата
  String _resp = "";                            // Переменная для хранения результата
  long _timeout = millis() + 10000;             // Переменная для отслеживания таймаута (10 секунд)
  while (!SIM900.available() && millis() < _timeout)  {}; // Ждем ответа 10 секунд, если пришел ответ или наступил таймаут, то...
  if (SIM900.available()) {                     // Если есть, что считывать...
    _resp = SIM900.readString();                // ... считываем и запоминаем
    Serial.println(_resp);
  }
  else {                                        // Если пришел таймаут, то...
    Serial.println("Timeout...");               // ... оповещаем об этом и...
  }
  return _resp;                                 // ... возвращаем результат. Пусто, если проблема
}


void sendSMSinPDU(String PDUlen, String PDUPack)
{

  
    SIM900.print("AT\r"); waitResponse();
    delay(100);
    sendATCommand("AT+CMGF=0", true);  // Включаем PDU-режим 
    delay(100);
    SIM900.print("AT+CMGS=" + PDUlen); SIM900.write('\r'); waitResponse();
    delay(100);
    SIM900.print(PDUPack + (String)((char)26));    
    waitResponse();

}


void AnalizeResponseSMS(){
  
  long _timeout = millis() + 10000;

  while (millis() < _timeout) 
  {  
    
    if (SIM900.available())   {                   // Если модем, что-то отправил...
      _response = waitResponse();                 // Получаем ответ от модема для анализа
      _response.trim();                           // Убираем лишние пробелы в начале и конце
      Serial.println(_response);                  // Если нужно выводим в монитор порта
      //....
      if (_response.startsWith("+CMGS:")) {       // Пришло сообщение об отправке SMS
        int index = _response.lastIndexOf("\r\n");// Находим последний перенос строки, перед статусом
        String result = _response.substring(index + 2, _response.length()); // Получаем статус
        result.trim();                            // Убираем пробельные символы в начале/конце
  
        if (result == "OK") {                     // Если результат ОК - все нормально
         Serial.println ("Message was sent. OK");
//          delay(100);
          responsePositive = true;
          responseReceived = true;
        }
        else {                                    // Если нет, нужно повторить отправку
         Serial.println ("Message was not sent. Error");
//          delay(100);
          responsePositive = false;
          responseReceived = true;
        }
      }

      if (_response == "BAD")
      {
          responsePositive = false;
          responseReceived = true; 
          Serial.println ("Message was not sent. Error");
          break;           
      }

    }
    if (Serial.available())  {                    // Ожидаем команды по Serial...
      SIM900.write(Serial.read());                // ...и отправляем полученную команду модему
    };
  
  }
}
Коду во многом обязан многоуважаемому andycat. 
 
если я посылаю в порт 
S112250001000B919702996976F700080C041F04400438043204350442 
PDU пакет - 0001000B919702996976F700080C041F04400438043204350442 "Привет"
- то мне на телефон приходит смс и я радуюсь ...
если же я отравляю 
S1131230001000B919702996976F700083E041F0440043804320435044200210020041F0440043804320435044200210020041F0440043804320435044200210020041F044004380432043504420021
PDU пакет - "Привет! Привет! Привет! Привет! Привет! Привет! Привет!" 
- то ничего не уходит - и я знаю причину потому что ардуино не может принять все эти символы ... 
и обрезает сообщение таким образом
 
S1131230001000B919702996976F700083E041F0440043804320435044200210020041F0440043804320435044200210020041F044004380432043504201004F404842454202
- то есть ограниченое количетсво символов в буфере обмена.
 
 
MaksVV пишет:
ТС, если у вас мега 328, то при операциях с большими строками, ОЗУ может не хватить.
- да у меня MEGA328P Чип 16 МГц. вот такой вот ...
 
 
Нужно другой покупать ? или у этого возможно увеличить буфер обмена ???
Каким способом подскажите люди добрые ???
 
Bruzzer
Offline
Зарегистрирован: 17.03.2020

DEL

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

volodya3d пишет:

код с помощью которого я отправляю прост

  while (Serial.available()) {
    char inChar = Serial.read();
    if (inChar != '\n') inStringCommand += inChar; 
  }

но проблема в том что у меня получилось передать арудино только 63 символа и все (((.

Давайте, Вы сначала научитесь отличать отправку от получения. В данном коде ничего не отправляется - это код для чтения из порта, а не для отправки в него.

Повторяю во второй раз. Для того чтобы отправить, допустим, мегабайт, вовсе не нужно заводить буфер на мегабайт. Отправляйте то, что Вам нужно по частям, а не всё за одну операцию.

Logik
Offline
Зарегистрирован: 05.08.2014

/////В папке с Arduino IDE ищем файл SoftwareSerial.h и .....

////

Serial.available()) {
2   char inChar = Serial.read();

И здаётся мне что это несколько разные сириалы. Вам вообще какой из них жмет в размере?

b707
Offline
Зарегистрирован: 26.05.2017

volodya3d - вы точно код правильный прислали? он вообще работать не должен

Если я совсем не ослеп, у вас блок с 72 по 140 строчку выполняется ДЛЯ КАЖДОГО принятого символа?

А что касается того, что у вас мессдж обрезается - так похоже дело в том, что у вас просто не хватает динамической памяти для увеличения типа String. У вас крайне неээфективный код, куча стрингов, которые вы бесконечно выделяете и никогда не чистите...

Уверен, что буфер приема Сериал тут не причем - тут "всю систему менять надо"

Logik
Offline
Зарегистрирован: 05.08.2014

Очередная жертва мифа 'ардуино это просто'. 

 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Беда :(

volodya3d
Offline
Зарегистрирован: 09.09.2020

Logik пишет:
И здаётся мне что это несколько разные сириалы. Вам вообще какой из них жмет в размере

- я понял. С помощью SoftwareSerial.h мы отправляем с ардуино на модуль сим900. Да я тупанул ... 

Logik пишет:
Очередная жертва мифа 'ардуино это просто'.

- Вот где я такое сказал ??? Вы прямо с первого раза все понимали когда начинали ??? Начинаю вникать в ардуино. Да тупанул, объекты разные.

ЕвгенийП пишет:
Давайте, Вы сначала научитесь отличать отправку от получения. В данном коде ничего не отправляется - это код для чтения из порта, а не для отправки в него.

- да я понял. Тупанул.

ЕвгенийП пишет:
Отправляйте то, что Вам нужно по частям, а не всё за одну операцию.

- Количество данных читаемых ардуино из порта как то можно регулировать ? как то можно увеличить ?

nik182
Offline
Зарегистрирован: 04.05.2015

Если читать по мере поступления, то нет никаких ограничений, кроме объёма памяти на разбор пришедшего. Если ждать пока заполнится буфер, то размер буфера определяет количество данных. Вообще это неправильная постановка вопроса. Количество прочитанных данных данных определяется только программой. Ардуина читает всё. До бесконечности. Ваша программа должна полученные данные обрабатывать по мере поступления, а не ждать, пока буфер заполнится. Буфер нужен на время, пока ардуина отвлекается на другие задачи. В любом случае скорость прихода символов на много меньше скорости обработки.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

volodya3d, у вас проблемы в фундаментальных знаниях и опыте программирования МК, вы начните с задачи попроще.
Сказано же выше, не надо пытаться все вычитать с порта. Задайте поиск по интернету чтение о обработка данных sim800 online - сотни примеров.

volodya3d
Offline
Зарегистрирован: 09.09.2020
nik182 пишет:
Вообще это неправильная постановка вопроса.
- Это я понял. Каюсь. Вообще я конечно путаюсь в понятиях и объектах как видно выше ... Да еще пока уровень чуть выше нуля (((
 
andycat пишет:
volodya3d, у вас проблемы в фундаментальных знаниях и опыте программирования МК
- это я знаю я и не претендовал на звание Гуру. Каюсь пока разбираюсь. Да еще пока уровень чуть выше нуля (((
 
nik182 пишет:
В любом случае скорость прихода символов на много меньше скорости обработки.
- Это понятно. Спасибо.
 
nik182 пишет:
Количество прочитанных данных данных определяется только программой. Ардуина читает всё. До бесконечности. Ваша программа должна полученные данные обрабатывать по мере поступления, а не ждать, пока буфер заполнится. Буфер нужен на время, пока ардуина отвлекается на другие задачи.
- программой это вы имеете ввиду скетчем? 
Может быть опять кто то скажет что вопрос тупой и вы уже объяснили но я до конца не понял. 
Serial.available() - эта функция справшивает у мониторинга пришли ли какие либо данные в него. Затем я могу прочитать каждый символ Serial.read().  При считывании Serial.read() считываются не все символы посланные в мониторинг порта мной (если стока большая) значит есть ограничения.
Какое количетсво символов я могу передать в мониторинг порта единовременно? есть ли возможность увеличить количество символов ?
 
andycat пишет:
не надо пытаться все вычитать с порта.
 
- не надо пытаться на сколько ? любое сообщение я могу разбить на 5 частей могу на 20 ... 
Какое количетсво символов я могу передать в мониторинг порта единовременно? есть ли возможность увеличить количество символов ?
 
Подскажите пожалуйста ...
b707
Offline
Зарегистрирован: 26.05.2017

Володя, вы опять ничего не поняли. Вам не надо посылать данные частями, суть в том, чтобы обрабатывать данные по мере поступления.
Я еще раз приведу пример с приемом ответа от вебсервера - вебсервер шлет непрерывно сотни и тысячи строк - тут никакого буфера не хватит и сервер не попросишь подождать
Тем не менее, я легко примаю ардуиной ответ от гугля и выделяю из него нужную информацию. Секрет в том, чтобы обрабатывать данные, как только они приняты
А ваши вопросы сколько символов вы можете принять за раз - показывают что вы думаете совсем в неправильном направлении. Ответ на ваш вопрос - принять из сериала можно сколько угодно - хоть 100 символов, хоть 1000 .... и буфер тут непричем

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

volodya3d пишет:

- Количество данных читаемых ардуино из порта как то можно регулировать ? как то можно увеличить ?

Ардуино вообще ничего не читает. Читаете Вы (Ваша программа). Как напишете, так и читать будет.

MaksVV
Offline
Зарегистрирован: 06.08.2015

ТС, чтобы написать годную программу нужно серьезно разобраться в действии каждой функции, например таких как Serial.read(), Serial.available() и т.д. Не нужно угадывать и писать наобум (сам так делал в свое время и ничего хорошего не вышло). Уж так повелось, что без теории в программировании никуда. Нужно все же что-нибудь почитать. В интернете про это много инфы. 

И да, читать данные от модема нужно не за один проход луп. 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017
andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017
volodya3d
Offline
Зарегистрирован: 09.09.2020

Уважаемые andycat, MaksVV, ЕвгенийП, b707, nik182 и другие спасибо за помощь.

MaksVV пишет:
ТС, чтобы написать годную программу нужно серьезно разобраться в действии каждой функции, например таких как Serial.read(), Serial.available() и т.д. Не нужно угадывать и писать наобум
 
- Я и пытаюсь разобраться. Serial.available() - функция проверяющая есть ли какие либо данные в ком порте. если есть то читаем данные побайтно Serial.read(),.
- Конечно разбираюсь на уровне плинтуса, и я сам это знаю. Пытаюсь все исправить. Читаю по мере возможности.

MaksVV пишет:
И да, читать данные от модема нужно не за один проход луп.

- да я так и сделал и все заработало ... я разбил сообщение отправляемые в порт на 4 и принимал их почастям. и теперь все работает ... я сделал вот так вот -

if (intNumberOfPartsSMS == 1) PDUPack1 = inStringCommand.substring(6 + intVolumeOfNumbers);
if (intNumberOfPartsSMS == 2) PDUPack2 = inStringCommand.substring(6 + intVolumeOfNumbers);
if (intNumberOfPartsSMS == 3) PDUPack3 = inStringCommand.substring(6 + intVolumeOfNumbers);
if (intNumberOfPartsSMS == 4) PDUPack4 = inStringCommand.substring(6 + intVolumeOfNumbers);

// и далее в функции отправки смс

SIM900.print(PDUPack1);
SIM900.print(PDUPack2);
SIM900.print(PDUPack3);
SIM900.print(PDUPack4 + (String)((char)26));    

и у меня все заработало ... чему я несказанно рад ... 

Спасибо за помощь форумчане !!!

Может я не правильно формулирую вопрос - но поробуйте пожалуйста ответить ... понимая что я на начальном уровне ...

допустим я могу отправить в ком порт символ 1, и ардуино прочитает этот символ и вернет мне его .. могу отправить и  1111111111 (десять едениц) и ардуино прочитает все эти символы и вернет мне обратно ...

А могу я отправить 100 едениц ? могу 1000 ??? Единожды ??? чем ограничивается количество символов ???

MaksVV
Offline
Зарегистрирован: 06.08.2015

Хоть мильен. При приеме данных надо опираться на какие то рамки. Т.е. информацию разбивать на пакеты. В случае с модемом это строки, которые заканчиваются символами перевода строки и каретки. Это ключевые символы, по которым определяется конец строки (пакета). Ищите в сети примеры работы с сим800. За каждый проход лупа , если в буфере Сериал порта есть новый полученный символ , он читается и добавляется к вашей получаемой строке. И так делаем пока не получим конец строки. Дак вот ваш вопрос более справедлив не к размеру буфера сериал порта, а к размеру вами созданного буфера для сбора строки. Его вы сами определяете (размер массива символов).
А отправлять то как бы и вообще не надо буфера сериал порта, отсылаете да и все , хоть сколько байт. Другое дело, откуда вы этот объем байт будете брать. Размер этого объема ( а скорее всего он будет лежать у вас в ОЗУ) и будет определяющим.

volodya3d
Offline
Зарегистрирован: 09.09.2020

MaksVV пишет:
Хоть мильен. При приеме данных надо опираться на какие то рамки.

- уважаемый Макс ничего подобного если написать простой скетч в цикле луп

while (Serial.available()) {
  char inChar = Serial.read();
  Serial.println(inChar);
} 

и ввести в мониторинг порта большую строку - то не все данные выведет обратно ардуино ...

Почему ???

ЗЫ для своего скетча я решение нашел ... дело не в этом ... мне просто для понимания ...

 

MaksVV пишет:
Другое дело, откуда вы этот объем байт будете брать. Размер этого объема ( а скорее всего он будет лежать у вас в ОЗУ) и будет определяющим.

- то есть если посмотреть на скетч выше количество байт определяется размером ОЗУ так ? правильно я понял? или опять туплю ???

Сильно не пинайте я же новичок ...

b707
Offline
Зарегистрирован: 26.05.2017

Тупите. Вам уже десять человек сказали одно и то же - а до вас все не доходит. То, сколько вы можете ПРИНЯТЬ символов - зависит от СПОСОБА ПРИЕМА,а не от способа отправки. Разделив свой пакет данных на части, вы пошли неверным путем.
Если в вашем тестовом коде добавить внешний цикл вокруг while() - будет приниматься все, сколько бы вы не отправили.

b707
Offline
Зарегистрирован: 26.05.2017

Володя, проделайте простой эксперимент- возьмите свой код из сообщения 26 ( да-да, вот эти три строчки) и поместите их в loop. Только их, все остальное из лупа уберите.
Если теперь вы будете посылать ардуине ваши строки - вы увидите, что принимаются любые, и короткие и длинные

MaksVV
Offline
Зарегистрирован: 06.08.2015

volodya3d пишет:

- то есть если посмотреть на скетч выше количество байт определяется размером ОЗУ так ? правильно я понял? или опять туплю ???

Сильно не пинайте я же новичок ...


Вы не правильно поняли. Вам толдычут, что нельзя забивать озу полностью. Я не очень внимательно топик читал, но вроде вы хотите собирать пду сообщения для отправки на модем? Дак вот вообще не проблема отправить много байт на модем. Проблема их гдето правильно хранить, ведь откуда то вы же их собрались отправлять?дак вот как вы их храните - это куча String ов, забьет любое озу. И тут проблемы будут уже не с отправкой байт, а вообще с выполнением и стабильностью работы программы. Глюки могут быть непомерные, вплоть до перезагрузки МК. Выше сказанное касается именно отправки байт. Потому как вы похоже не разделяете эти понятия прием и отправку. Ваши ошибки при получении байт уже выше в постах описаны

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

volodya3d пишет:

- уважаемый Макс ничего подобного если написать простой скетч в цикле луп

while (Serial.available()) {
  char inChar = Serial.read();
  Serial.println(inChar);
} 

и ввести в мониторинг порта большую строку - то не все данные выведет обратно ардуино ...

Почему ???

Хотя бы потому, что за одну итерацию Вы принимаете 1 байт, а отправляете - 3.

А вообще, Вы не с той стороны подходите. Нужно интересоваться не "сколько байт можно отправить" а "какое время эта оправка замет". Последовательный порт - медленное устройство, а Вы пытаетесь программировать его так, как будто оно работает мгновенно.