получает в AVR микроконтроллер просто читает два символа

0

Я делаю proyect, который предполагает связь между GSM-модулем и ATMEGA328P. Я пытаюсь эмулировать через терминал модуль GSM, прежде чем пытаться с AVR проверить, работает ли моя программа правильно, однако всякий раз, когда я ввожу строку, которая считывается функцией "получает", строка не будет правильно захвачена. Я проверил, пытаясь отобразить его с помощью "printf" после прочтения, и отображает только первые два символа. Любая идея, почему это происходит? Я пытаюсь очистить буфер после ввода строки с помощью этого: "while ((ch = getchar())! = '\n'); чтобы избежать проблем, так как мне нужно прочитать несколько значений и всякий раз, когда я печатаю, я добавляю CR + LF как это делает GSM-модуль.

Вот часть кода:

writeSerial("AT+CMGF=1");
clear();
readSerial(status);
writeSerial(status);

Перечисленные выше функции объявляются следующим образом:

void clear(void){
    char ch;    
    while ((ch = getchar()) != '\n');
}

void readSerial(char *arr){
    gets(arr,sizeof(arr));
}

void writeSerial(char *arr){
    printf("%s\r\n", arr); //CR+LF
}    
  • 4
    sizeof(arr) не делает то, что вы думаете - он просто дает вам размер самого указателя, а не размер буфера, на который он указывает. Вам нужно будет передать дополнительный параметр для размера буфера.
  • 1
    Где это gets определенную функцию? Существует или, скорее, была функция с таким именем в стандартной библиотеке C, но она принимает только один аргумент. (Он был удален в C11, потому что его нельзя безопасно использовать.) Если возможно, я предлагаю дать ему другое имя, чтобы избежать путаницы для читателей-людей и, возможно, для компилятора и / или компоновщика.
Показать ещё 2 комментария
Теги:
avr
gsm
microcontroller

3 ответа

0
Лучший ответ

sizeof(arr) == 2, потому что arr - это char* не массив.

Массивы в C не являются первоклассными типами данных и не могут быть переданы функции; вместо этого передается указатель и теряется информация о размере массива. Вам нужно передать длину отдельно.

void readSerial(char *arr, size_t len )
{
    gets( arr, len ) ;
}

Обратите внимание, что стандартная библиотека gets() не принимает параметр размера в любом случае. Я предполагаю, что это нестандартная реализация.

В стороне, ваша функция clear() может быть упрощена:

void clear(void)
{
    while( getchar() != '\n' ) ;
}

Хотя обратите внимание, что если буфер уже пуст, он будет ждать бесконечно для новой строки, поэтому, вероятно, это не то, что вы хотите в любом случае.

  • 0
    Здорово! Я думаю, что sizeof () на самом деле читает размер указателя, как сказано в других ответах на этот пост. Странная вещь в get () заключается в том, что в справочном руководстве по AVR Libc он показан только с одним параметром, а в CodeVision я получаю сообщение об ошибке «с несколькими аргументами в вызове функции», если не указать длину массива , Во всяком случае, теперь это работает, спасибо!
  • 0
    Ты тоже прав насчет ясности, спасибо!
1

Это не верно:

void readSerial(char *arr) {
  gets(arr,sizeof(arr));
}

На ваших указателях AVR ширина 16 бит, поэтому sizeof(arr) == 2. Вместо использования sizeof, возможно, readSerial() длину байта arr как дополнительный параметр для readSerial().

  • 0
    Вы абсолютно правы, спасибо!
1

Рассмотрите возможность перезаписи вашей функции readSerial следующим образом:

void readSerial(char *arr, size_t array_size ){
    gets(arr, array_size);
}

Функция должна быть вызвана следующим образом:

char a[20] = {0};
readSerial( a, sizeof(a) );

В вашем случае размер оператора возвращает размер указателя на char (char *), а не размер массива.

  • 0
    Но все же sizeof (a) просто дает мне размер только первого элемента в массиве, или я ошибаюсь? В любом случае решение с дополнительными параметрами работает как шарм! Спасибо!
  • 1
    @ ToñoM Нет, sizeof(a) дает количество байтов, занятых всем массивом. sizeof(a[0]) даст вам количество байтов, занятых первым элементом. sizeof(a)/sizeof(a[0]) является обычной идиомой для получения количества элементов в массиве, но так как ваш массив имеет char и sizeof(char)==1 (по определению), в этом случае нет необходимости ,

Ещё вопросы

Сообщество Overcoder
Наверх
Меню