11.02.2018, 01:58
|
|
Прописка
Регистрация: 29.03.2007
Сообщений: 185
Сказал спасибо: 11
Сказали Спасибо 1 раз в 1 сообщении
|
Неправильное наполнение массива 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. и там всегда последняя ячейка пустая. Но это как-то некомильфо.
|
|
|
|
11.02.2018, 02:05
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,637
Сказал спасибо: 116
Сказали Спасибо 814 раз(а) в 591 сообщении(ях)
|
Re: Неправильное наполнение массива stm32
strcat библиотечный? А в прерываниях точно нет этой гадости?
Не удивлюсь, если там еще и HAL/SPL какой-нибудь!
Некошерно как-то...
Наибольшее подозрение у меня, что буфер портится в результате срабатывания прерывания. Но кто ж его знает, что там в реальности? Кода-то нет!
__________________
Союз Советских Социалистических Округов Северной Америки
|
|
|
|
11.02.2018, 02:07
|
|
Гуру портала
Регистрация: 17.07.2010
Адрес: мурмурляндия
Сообщений: 10,697
Сказал спасибо: 189
Сказали Спасибо 3,191 раз(а) в 2,068 сообщении(ях)
|
Re: Неправильное наполнение массива stm32
Какаято жопа с синтаксисом
__________________
кагмаподэ магмаподэ
|
|
|
|
11.02.2018, 02:31
|
|
Прописка
Регистрация: 29.03.2007
Сообщений: 185
Сказал спасибо: 11
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Неправильное наполнение массива stm32
Сообщение от eddy
|
strcat библиотечный? А в прерываниях точно нет этой гадости?
Не удивлюсь, если там еще и HAL/SPL какой-нибудь!
Некошерно как-то...
Наибольшее подозрение у меня, что буфер портится в результате срабатывания прерывания. Но кто ж его знает, что там в реальности? Кода-то нет!
|
Да, библиотечный. В прерываниях ничего такого просто нет. И ни халов ни спл нет. Чисто ЦМСИС
|
|
|
|
11.02.2018, 03:43
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.03.2010
Сообщений: 2,897
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
|
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.
|
|
|
Эти 5 пользователя(ей) сказали Спасибо AR_Favorit за это сообщение:
|
|
|
11.02.2018, 15:44
|
|
Гражданин KAZUS.RU
Регистрация: 02.06.2003
Адрес: Челябинск
Сообщений: 545
Сказал спасибо: 10
Сказали Спасибо 341 раз(а) в 202 сообщении(ях)
|
Re: Неправильное наполнение массива stm32
Сообщение от supercelt
|
Почему так происходит, если я присобачиваю строку strcat(gsm_pin_command, gsm_pin); и использую там не указатель gsm_point_pin, а массив gsm_pin. Ну точнее я понимаю что он видится как указатель на 0 элемент, но массив же ограничен по длине. Как это туда добавляется.... не понятно.
Я избежал этого путём того что массив для пина просто увеличил на 1. и там всегда последняя ячейка пустая. Но это как-то некомильфо.
|
По окончании ввода в массив для пина нужно добавлять терминатор строки - '\0'. Или нет?
|
|
|
|
11.02.2018, 16:31
|
|
Прописка
Регистрация: 29.03.2007
Сообщений: 185
Сказал спасибо: 11
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Неправильное наполнение массива stm32
ну да... я так понял что надо добавлять, соответственно вы правы, надо выделять на 1 ячеку больше, чем предполагаемая строка. Спасибо
|
|
|
|
11.02.2018, 21:19
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,257
Сказал спасибо: 11,170
Сказали Спасибо 3,858 раз(а) в 2,928 сообщении(ях)
|
Re: Неправильное наполнение массива stm32
supercelt, собственно для понимания необходимо вспомнить термин asciiz для представления строк в C (и не только). Вот для этой части, которая "z" в наименовании и нужен дополнительный байт. Наличие этого байта необходимо учитывать во всех операциях работы со строками.
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
|
|
|
|
05.03.2018, 20:05
|
|
Вид на жительство
Регистрация: 10.04.2010
Сообщений: 301
Сказал спасибо: 25
Сказали Спасибо 136 раз(а) в 79 сообщении(ях)
|
Re: Неправильное наполнение массива stm32
Сообщение от индюк
|
Какаято жопа с синтаксисом
|
Да и непонятно в какой среде написано. Поди стек с кучей установлен непонятно какой.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 13:14.
|
|