Официальный сайт компании Arduino по адресу arduino.cc
Получить строку из массива байт. Как?
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Пнд, 23/04/2018 - 18:07
Доброго времени суток, Дамы и Господа. Работаю с Shield SIM900 китайский на Али
Получаю СМС в массив байт так:
if (sim900.available()) //Если порт готов while(sim900.available()) { buffer[count++]=sim900.read();//Собираю массив байт Serial.println(count);//Слежу за заполнением массива if(count >= bufsize) { //Если больше 256 Serial.println("##bufsize##");//Массив заполнен SMSString = String((char*)buffer);//Пишу в строку. Буду дальше работать со строкой Serial.println(SMSString);//Пишу в порт Serial.println("КОНЕЦ"); clearBufferArray();//Очистим буфер count = 0;// Счетчик в 0 break;// Вышли } } }
Получаю результат:
##bufsize## КОНЕЦ
Вопрос: Где строка? Помогите найти, что не так? Спасибо.
весь код где?
зачем два буфера buffer SMSString?
clearBufferArray() - ?
Код нужно давать рабочий, чтобы можно было запустить, а не огрызки.
СМС-то по-русски поди?
SMSString - это переменная типа String, buffer - массив байт. clearBufferArray - функция, которая в цикле присваивает элементам buffer значение null. Это, в общем-то, весь код и есть. Там еще есть много лирики к чтению СМС никак не относящаяся. Весь код завтра спрошу обязательно.
Завтра код спрошу. Но здесь почти все. СМС только на латинице. Да, еще - если пишу буфер через write, то строка пишется корректно. Serial.write(buffer, count); Но мне надо работать со строкой типа String.
Весь код:
Привел весь код
для очистки буфера достаточно в первый байт ноль записать
зачем двойное преобразование 35 и 36 строка для вывода в монитор? разве 37 строка не выводит информацию?
да и вообще работа со String рано или поздно выйдет вам боком - переполнением памяти, тут рядом тема была - зависал модуль при приеме СМС или USSD
buffer[count++]=sim900.read() - с учетом того, что count изначально равен 0 всегда порождает пустую строку, т.к. массив начинает заполняться только со второго символа оставляя первый нулевым (вообще принято считать, что это не точно)) инициализируйте count=-1, если конструкцию не менять...
Вопрос: Где строка? Помогите найти, что не так? Спасибо.
По буферу, спасибо за информацию.
37-я выводит. Не в выводе дело. Я хочу продолжить работу со строкой String и ее удобными функциями поиска по строке, конкатенации и замены и прочье.
Вообще у меня задача получить длинную СМС (до 160 символов латиницей) и разбить ее на значения, полученные значения некой настройки присвоить переменным Ардуино. Например, "v=123/v1=17/v2=45/v3=79175555555..." и так далее.
Спасибо за совет, попробую. Для меня, если честно, оказалось откровением, что массив заполняется со второго символа. Что же лежит тогда в первом? Просто нуль? Зачем? Где почитать?)
Проверял 37-ой строкой:
Строка с сообщением есть.
конечно оно есть. но первый элмент массива char имеет значение 0, при передаче такого массива в String получаем пустую строку
Понял. Спасибо. Буду проверять что у меня в первой ячейке массива.
В конец буфера никто не пишет 0, а для операции в строке 35 он там нужен. Так что заполняйте буфер не до конца, а в конец ручками 0 приписывайте.
Надеюсь, Вы знаете, что делаете, требуя полного заполнения буфера. Хвост (не кратный 255) Вы обязательно потеряете, т.к. она будет ждать пока буфер не заполнится и ничего не делать.
В конец буфера никто не пишет 0, а для операции в строке 35 он там нужен. Так что заполняйте буфер не до конца, а в конец ручками 0 приписывайте.
Надеюсь, Вы знаете, что делаете, требуя полного заполнения буфера. Хвост (не кратный 255) Вы обязательно потеряете, т.к. она будет ждать пока буфер не заполнится и ничего не делать.
Да, я понимаю, спасибо. Это тест. Мне сейчас важно строку получить или плюнуть и работать с байтами и символами.
buffer[count++]=sim900.read() - с учетом того, что count изначально равен 0 всегда порождает пустую строку, т.к. массив начинает заполняться только со второго символа оставляя первый нулевым (вообще принято считать, что это не точно)) инициализируйте count=-1, если конструкцию не менять...
Вот спасибо! Все в точку. У меня в первом байте был 0. Установил count в -1 и, вуаля, моя строка.) Счастлив без меры, а потратил на это 3 дня!))
Чего-то я недопонял в этой жизни. Ну, да, ладно.
конечно оно есть. но первый элмент массива char имеет значение 0
глупость какая :(
это где написано?
ЗЫ. Впрочем можно не отвечать, главное что у ТС все работает.
ЗЫ. Впрочем можно не отвечать, главное что у ТС все работает.
все-таки отвечу, что бы у наших читателей в будущем было меньше вопросов. как уже говорилось ранее, алгоритм формирования строки начинал заполнение масива char со второго символа. почему первый элемент получает значение 0? я говорил, что принято считать что это не точно, т.е. нельзя полагаться что после включения устройства в памяти будут содержаться одни нули, хотя современная память в силу технических особенностей имеет обнуленное состояние после включения, предполагается, что там хаос и прграмма должна сама инициализировать начальные состояния данных.
Почему не точно? Статическая инициализация прописана в стандарте языка. Так что никакого отношения к апппаратным особенностям работы памяти это не имеет.
был уверен, что делает это именно компилятор, но обсуждение с коллегами на перекуре заставило меня изменить свое мнение) а память не тронутая компилятором будет иметь хаотичное состояние или все же какое-то определенное?
Я не знаю, что за память нетронутая компилятором - куча, что ли? Про неё стандарт ничего не говорит. Там чётко прописано лишь то, что все статические переменные (включая глобальные) перед выполнением программы должны быть проинициализированы нулями.
buffer[count++]=sim900.read() - с учетом того, что count изначально равен 0 всегда порождает пустую строку, т.к. массив начинает заполняться только со второго символа оставляя первый нулевым (вообще принято считать, что это не точно)) инициализируйте count=-1, если конструкцию не менять...
Почему со второго начинает заполняться когда используется постфиксная операция? При count равном 0 массив начнет заполняться с нулевого элемента. Или я совсем уже ничего не понимаю и пора на пенсию.
Я так понимаю DenSyo сложно представляет как строка в памяти лежит и книжки не читает или вспомнил Pascal где первый байт размер строки хранит.
Хрень короче пишет, хотя может я и не прав, но почему я обнуляю строку записав в первый байт 0 и вообще строку с первого байта пишу - что я делаю не так ?
andycat, Penni, ЕвгенийП
ребята! вы слишком много курите! (с) вместо того, что бы проверить код, строчите на форуме...
какой порядок выполнения этого выражения: buffer[count++]= ?
вы серьезно думаете, что вначале присвоение, а потом инкремент? это в каких книжках так?
хамите беспочвенно. совершенно непонимая о чем идет речь. остальные сами поймут, вам разжую. имеем массив buffer[256] изначально = {0,0,0,0,0,0,0....} все значения 0, так компилятор инициализирует объявленные переменные. есть счетчик текущей длины массива изначально заданный 0 и сбрасываемый до 0 перед чтением каждой новой строки. начинаем в цикле посимвольно запонять строку: buffer[0++]=, где 0++ == 1 в языке си который мы тут обсуждаем. элементу массива buffer[0] никогда не будет присваиваться значение пока не инициализируем счетчик как -1. вот и имеем всегда первым символом строки символ с кодом 0. т.е. пустую строку.
вот от этого мне особенно грустно((( озвучена проблема, предложено решение, выполнен тест который подтверждает правильность решения. а чё, почему, неважно. работает, да и ладно. пока не научитесь критически мыслить наши ракеты не полетят.
andycat, Penni, ЕвгенийП
ребята! вы слишком много курите! (с) вместо того, что бы проверить код, строчите на форуме...
какой порядок выполнения этого выражения: buffer[count++]= ?
вы серьезно думаете, что вначале присвоение, а потом инкремент? это в каких книжках так?
Проверяйте на здоровье, а ссылки на книжки где это написано кидали выше
И вот совсем школьный пример
Что в первом лупе напечатает принтл?
какой порядок выполнения этого выражения: buffer[count++]= ?
вы серьезно думаете, что вначале присвоение, а потом инкремент?
Нет, конечно! Мы вообще не думаем об этом, мы это твёрдо знаем - сначала присваивание, а потом инкремент.
это в каких книжках так?
Во всех без исключения.
Вы, кстати, хоть одну прочитали? Нет? Так нафига ж: "в присутствии двух людей с университетским образованием позволяете себе с развязностью совершенно невыносимой подавать какие-то советы космического масштаба и космической же глупости"?
И вообще, по поводу Вашего поста, опять же из Булгакова:
"Вы, Шариков, чепуху говорите и возмутительнее всего то, что говорите её безапелляционно и уверенно."
Честно говоря, когда ребята начали подшучивать и я их поддержал, я ожидал Вашего вопроса: "что не так?" и даже подготовил ответ. Но Вы решили не задавать вопросов, а поучить нас расчитывать ракеты. ну, что ж, в добрый путь! Удачи :)
да, лопухнулся(((
да, лопухнулся(((
Очень рад, что признали - респект и уважуха! Добро пожаловать к нам!
С подготовленным ответом, вечером, ладно, сейчас на работу пора.