Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту


 
Опции темы

Неправильное наполнение массива stm32

Непрочитано 11.02.2018, 01:58  
supercelt
Прописка
 
Регистрация: 29.03.2007
Сообщений: 185
Сказал спасибо: 11
Сказали Спасибо 1 раз в 1 сообщении
supercelt на пути к лучшему
По умолчанию Неправильное наполнение массива stm32

Доброй ночи! Подскажите почему получается такой итог?

Объявляю нужные мне данные

Код:
#define GSM_PIN_SIZE 4

#define GSM_PIN_COMMAND_SIZE (11 + GSM_PIN_SIZE)

char gsm_pin[GSM_PIN_SIZE] = "", *gsm_point_pin = gsm_pin; //хранилище пин кода симки и указатель на этот массив

char gsm_pin_command[GSM_PIN_COMMAND_SIZE] = ""; //Здесь будет лежать команда, которая полетит в модем.

char *gsm_creg_command = ",CS^CREG?\r";// А это просто кусок следующего кода не относящийся к работе с пином, но потом поймёте зачем я его тут указал.

//Пин код набирается на матричной клаве. И символы помещаются в массив
Код:
if(find_key){
lcd_send_data(find_key); //на экран
*gsm_point_pin = find_key; //Забиваем значение
menu_count_symbol++; //Считаем кол-во символов
gsm_point_pin++; //Прыгаем на следующий адрес ячейки в массиве
}
//Потом нажимается ввод и попадаем на следующий кусок кода


Код:
strcpy(gsm_pin_command,"AT+CPIN=\"");
strcat(gsm_pin_command, gsm_pin);
strcat(gsm_pin_command, "\"\r");
gsm_send(gsm_pin_command); //Отправляем команду на модем
В итоге команда должна получится такая: AT+CPIN="0000"\r
А получается вот такая: AT+CPIN="0000,C"

Вот этот кусок ,C берётся из массива, который следует за масивом хранилищем команды.
Заметил по отладчику, что когда я нажимаю на последнюю кнопку пина симки, то значение указателя gsm_point_pin
становится равным вот этому: 0000,C (точнее до посл символа напротив переменной пишется ее адрес (примерный): 0x0000012C, а после нажатия последнего выскакиевает вот это 0x0000012D&gsm_point_pin="0000,C")
именно после нажатия посл кнопки добавляется ,C

Почему так происходит, если я присобачиваю строку strcat(gsm_pin_command, gsm_pin); и использую там не указатель gsm_point_pin, а массив gsm_pin. Ну точнее я понимаю что он видится как указатель на 0 элемент, но массив же ограничен по длине. Как это туда добавляется.... не понятно.
Я избежал этого путём того что массив для пина просто увеличил на 1. и там всегда последняя ячейка пустая. Но это как-то некомильфо.
Реклама:
supercelt вне форума  
Непрочитано 11.02.2018, 02:05  
eddy
Почётный гражданин KAZUS.RUN
 
Аватар для eddy
 
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,684
Сказал спасибо: 116
Сказали Спасибо 823 раз(а) в 597 сообщении(ях)
eddy на пути к лучшему
По умолчанию Re: Неправильное наполнение массива stm32

strcat библиотечный? А в прерываниях точно нет этой гадости?
Не удивлюсь, если там еще и HAL/SPL какой-нибудь!
Некошерно как-то...

Наибольшее подозрение у меня, что буфер портится в результате срабатывания прерывания. Но кто ж его знает, что там в реальности? Кода-то нет!
__________________
Если ты пользуешься Windows, то ты финансируешь мировой терроризм!
eddy вне форума  
Непрочитано 11.02.2018, 02:07  
индюк
Гуру портала
 
Аватар для индюк
 
Регистрация: 17.07.2010
Адрес: мурмурляндия
Сообщений: 11,121
Сказал спасибо: 202
Сказали Спасибо 3,283 раз(а) в 2,149 сообщении(ях)
индюк на пути к лучшему
По умолчанию Re: Неправильное наполнение массива stm32

Какаято жопа с синтаксисом
__________________
кагмаподэ магмаподэ
индюк на форуме  
Непрочитано 11.02.2018, 02:31  
supercelt
Прописка
 
Регистрация: 29.03.2007
Сообщений: 185
Сказал спасибо: 11
Сказали Спасибо 1 раз в 1 сообщении
supercelt на пути к лучшему
По умолчанию Re: Неправильное наполнение массива stm32

Сообщение от eddy Посмотреть сообщение
strcat библиотечный? А в прерываниях точно нет этой гадости?
Не удивлюсь, если там еще и HAL/SPL какой-нибудь!
Некошерно как-то...

Наибольшее подозрение у меня, что буфер портится в результате срабатывания прерывания. Но кто ж его знает, что там в реальности? Кода-то нет!
Да, библиотечный. В прерываниях ничего такого просто нет. И ни халов ни спл нет. Чисто ЦМСИС
supercelt вне форума  
Непрочитано 11.02.2018, 03:43  
AR_Favorit
Почётный гражданин KAZUS.RUN
 
Регистрация: 13.03.2010
Сообщений: 2,896
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
AR_Favorit на пути к лучшему
По умолчанию Re: Неправильное наполнение массива stm32

Сообщение от supercelt Посмотреть сообщение

Код:
#define GSM_PIN_SIZE 4
...
char gsm_pin[GSM_PIN_SIZE] = "", *gsm_point_pin = gsm_pin; //хранилище пин кода симки и указатель на этот массив
Заметил по отладчику, что когда я нажимаю на последнюю кнопку пина симки, то значение указателя gsm_point_pin
становится равным вот этому: 0000,C (точнее до посл символа напротив переменной пишется ее адрес (примерный): 0x0000012C, а после нажатия последнего выскакиевает вот это 0x0000012D&gsm_point_pin="0000,C")
именно после нажатия посл кнопки добавляется ,C

Почему так происходит, если я присобачиваю строку strcat(gsm_pin_command, gsm_pin); и использую там не указатель gsm_point_pin, а массив gsm_pin. Ну точнее я понимаю что он видится как указатель на 0 элемент, но массив же ограничен по длине. Как это туда добавляется.... не понятно.
Да вроде все работает, как и должно.

strcat() работает с null-terminated string-ами, она длину строк, которые ей задаются в качестве аргументов, знать не знает, а обрабатывает в каждой символы с начального до тех пор, пока не встретит признак конца строки - 0х00. В исходную строку с адреса, где обнаружен 0x00, она начинает добавлять символы из второй, до тех пор, пока не обнаружит этот самый 0x00 во второй строке, после чего добавит 0x00 в исходную строку и закончит работу.

Вы задали массив gsm_pin[] из 4 элементов, и даете его начальный адрес строковой функции. Изначально в нём все ячейки содержат 0х00.

Пока добавлен первый, второй, третий символ - это все еще null-terminated string. Если скормить такой массив функции strcat() - она корректно добавит к исходной строке его содержимое (1, 2 или 3 символа соответственно).

Добавили в четвертую ячейку ненулевое значение - забили тем самым ноль, признака конца строки в рамках массива нет, функция strcat() добавляет к исходной строке и массив, и все подряд за массивом, пока не наткнется на 0х00. В вашем случае всего через пару символов (,C), видимо, этот самый 0х00 находится, иначе было бы еще некрасивей)))

Сообщение от supercelt Посмотреть сообщение
Я избежал этого путём того что массив для пина просто увеличил на 1. и там всегда последняя ячейка пустая. Но это как-то некомильфо.
Это именно так и должно быть. В массиве, который хотите использовать как аргумент для строковой функции, должен быть лишний байт для хранения 0х00 как признака окончания строки.

Если объявить просто
char gsm_pin[] = "хххх", будет выделено 5 байт, пятый из которых - 0х00.
AR_Favorit вне форума  
Эти 5 пользователя(ей) сказали Спасибо AR_Favorit за это сообщение:
dgrishin (11.02.2018), laser532 (11.02.2018), mike-y-k (11.02.2018), supercelt (11.02.2018), vvkka (27.03.2018)
Непрочитано 11.02.2018, 15:44  
Bill
Гражданин KAZUS.RUN
 
Регистрация: 02.06.2003
Адрес: Челябинск
Сообщений: 545
Сказал спасибо: 10
Сказали Спасибо 341 раз(а) в 202 сообщении(ях)
Bill на пути к лучшему
По умолчанию Re: Неправильное наполнение массива stm32

Сообщение от supercelt Посмотреть сообщение
Почему так происходит, если я присобачиваю строку strcat(gsm_pin_command, gsm_pin); и использую там не указатель gsm_point_pin, а массив gsm_pin. Ну точнее я понимаю что он видится как указатель на 0 элемент, но массив же ограничен по длине. Как это туда добавляется.... не понятно.
Я избежал этого путём того что массив для пина просто увеличил на 1. и там всегда последняя ячейка пустая. Но это как-то некомильфо.
По окончании ввода в массив для пина нужно добавлять терминатор строки - '\0'. Или нет?
Bill вне форума  
Непрочитано 11.02.2018, 16:31  
supercelt
Прописка
 
Регистрация: 29.03.2007
Сообщений: 185
Сказал спасибо: 11
Сказали Спасибо 1 раз в 1 сообщении
supercelt на пути к лучшему
По умолчанию Re: Неправильное наполнение массива stm32

ну да... я так понял что надо добавлять, соответственно вы правы, надо выделять на 1 ячеку больше, чем предполагаемая строка. Спасибо
supercelt вне форума  
Непрочитано 11.02.2018, 21:19  
mike-y-k
Модератор
 
Регистрация: 04.08.2010
Адрес: Москва СЗАО/МО
Сообщений: 12,272
Сказал спасибо: 11,856
Сказали Спасибо 4,157 раз(а) в 3,175 сообщении(ях)
mike-y-k на пути к лучшему
По умолчанию Re: Неправильное наполнение массива stm32

supercelt, собственно для понимания необходимо вспомнить термин asciiz для представления строк в C (и не только). Вот для этой части, которая "z" в наименовании и нужен дополнительный байт. Наличие этого байта необходимо учитывать во всех операциях работы со строками.
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
mike-y-k вне форума  
Непрочитано 05.03.2018, 20:05  
dkm
Вид на жительство
 
Регистрация: 10.04.2010
Сообщений: 301
Сказал спасибо: 25
Сказали Спасибо 136 раз(а) в 79 сообщении(ях)
dkm на пути к лучшему
По умолчанию Re: Неправильное наполнение массива stm32

Сообщение от индюк Посмотреть сообщение
Какаято жопа с синтаксисом
Да и непонятно в какой среде написано. Поди стек с кучей установлен непонятно какой.
dkm вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изучаем STM32 Cortex M3 EugVor ARM 6171 20.05.2025 20:16
Конкурс разработок на STM32 от ST, просьба поддержать strr ARM 2 14.03.2017 20:27
STM32 - краткий результат исследования применимости. ART_ME Отвлекитесь, эмбеддеры! 25 13.02.2017 10:37
Драйвер (не VCP) для встроенного USB STM32 vvv998 ARM 106 08.11.2014 21:36
IAR(6.5) размещение массива в flash (STM32) kvark85 ARM 10 12.07.2013 11:32


Часовой пояс GMT +4, время: 02:36.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.