Я делаю 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
}
sizeof(arr)
== 2, потому что arr - это char*
не массив.
Массивы в C не являются первоклассными типами данных и не могут быть переданы функции; вместо этого передается указатель и теряется информация о размере массива. Вам нужно передать длину отдельно.
void readSerial(char *arr, size_t len )
{
gets( arr, len ) ;
}
Обратите внимание, что стандартная библиотека gets()
не принимает параметр размера в любом случае. Я предполагаю, что это нестандартная реализация.
В стороне, ваша функция clear()
может быть упрощена:
void clear(void)
{
while( getchar() != '\n' ) ;
}
Хотя обратите внимание, что если буфер уже пуст, он будет ждать бесконечно для новой строки, поэтому, вероятно, это не то, что вы хотите в любом случае.
Это не верно:
void readSerial(char *arr) {
gets(arr,sizeof(arr));
}
На ваших указателях AVR ширина 16 бит, поэтому sizeof(arr) == 2
. Вместо использования sizeof
, возможно, readSerial()
длину байта arr
как дополнительный параметр для readSerial()
.
Рассмотрите возможность перезаписи вашей функции readSerial следующим образом:
void readSerial(char *arr, size_t array_size ){
gets(arr, array_size);
}
Функция должна быть вызвана следующим образом:
char a[20] = {0};
readSerial( a, sizeof(a) );
В вашем случае размер оператора возвращает размер указателя на char (char *), а не размер массива.
sizeof(a)
дает количество байтов, занятых всем массивом. sizeof(a[0])
даст вам количество байтов, занятых первым элементом. sizeof(a)/sizeof(a[0])
является обычной идиомой для получения количества элементов в массиве, но так как ваш массив имеет char
и sizeof(char)==1
(по определению), в этом случае нет необходимости ,
sizeof(arr)
не делает то, что вы думаете - он просто дает вам размер самого указателя, а не размер буфера, на который он указывает. Вам нужно будет передать дополнительный параметр для размера буфера.gets
определенную функцию? Существует или, скорее, была функция с таким именем в стандартной библиотеке C, но она принимает только один аргумент. (Он был удален в C11, потому что его нельзя безопасно использовать.) Если возможно, я предлагаю дать ему другое имя, чтобы избежать путаницы для читателей-людей и, возможно, для компилятора и / или компоновщика.