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

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

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

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

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

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


 
Опции темы
Непрочитано 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.RU
 
Аватар для eddy
 
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,581
Сказал спасибо: 115
Сказали Спасибо 806 раз(а) в 583 сообщении(ях)
eddy на пути к лучшему
По умолчанию Re: Неправильное наполнение массива stm32

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

Наибольшее подозрение у меня, что буфер портится в результате срабатывания прерывания. Но кто ж его знает, что там в реальности? Кода-то нет!
__________________
Смерть бандеровской мразоте!
eddy вне форума  
Непрочитано 11.02.2018, 02:07  
индюк
Гуру портала
 
Аватар для индюк
 
Регистрация: 17.07.2010
Адрес: мурмурляндия
Сообщений: 10,375
Сказал спасибо: 176
Сказали Спасибо 3,128 раз(а) в 2,017 сообщении(ях)
индюк на пути к лучшему
По умолчанию 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.RU
 
Регистрация: 13.03.2010
Сообщений: 2,901
Сказал спасибо: 499
Сказали Спасибо 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.RU
 
Регистрация: 02.06.2003
Адрес: Челябинск
Сообщений: 545
Сказал спасибо: 10
Сказали Спасибо 339 раз(а) в 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
Адрес: Москва СЗАО
Сообщений: 11,246
Сказал спасибо: 11,165
Сказали Спасибо 3,854 раз(а) в 2,925 сообщении(ях)
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 6166 19.02.2024 18:22
Конкурс разработок на 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, время: 03:36.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot