Какие существуют ограничения на длину String?

poleg
Offline
Зарегистрирован: 30.10.2012

 В программе приходится работать с внешним устройством по COM порту. На определенные команды это устройство может прислать ответ объемом до 800 байт. Используя String для чтения данных из Serial, получаю только 63 байта.
Где наложены ограничения? В буфере Serial или в String?

step962
Offline
Зарегистрирован: 23.05.2011

poleg пишет:
 В программе приходится работать с внешним устройством по COM порту. На определенные команды это устройство может прислать ответ объемом до 800 байт. Используя String для чтения данных из Serial, получаю только 63 байта.
Где наложены ограничения? В буфере Serial или в String?

Длина буфера Serial - 128 байт, проблемы возникают только в случае переполнения (поздней или недостаточно быстрой реакции на поступающую/поступившую информацию)
Длина строки ограничивается доступным объемом RAM.
Стало быть, ограничение - в ваших кодах, которые здесь не представлены.

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Ограничение буфера находится в файле hardware\arduino\cores\arduino\HardwareSerial.cpp

// Define constants and variables for buffering incoming serial data.  We're
// using a ring buffer (I think), in which head is the index of the location
// to which to write the next incoming character and tail is the index of the
// location from which to read.
#if (RAMEND < 1000)
  #define SERIAL_BUFFER_SIZE 16
#else
  #define SERIAL_BUFFER_SIZE 64
#endif

String ограничен только доступной памятью. Помните, что памяти в контроллере не вагон, она нужна еще для кучи переменных, стека и т.д. Постарайтесь лучше как-то изменить алгоритм приема строки или ее формат. Многовато 800 для дуины... 

step962
Offline
Зарегистрирован: 23.05.2011

 Это что за версия - с  таким ограничением?
В IDE23:

#if (RAMEND < 1000)
  #define RX_BUFFER_SIZE 32
#else
  #define RX_BUFFER_SIZE 128
#endif 


AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Версия 1.0.1 

poleg
Offline
Зарегистрирован: 30.10.2012

 Спасибо за наводку на файл HardwareSerial.cpp
По крайней мере смог безболезненно увеличить буфер для Serial до 100 байт... Буду пробывать изменить общий алгоритм...

step962
Offline
Зарегистрирован: 23.05.2011

 Там не длину буфера увеличивать надо, а вовремя читать из него.
То есть править ваши коды.