我正在做一个涉及GSM模块和ATMEGA328P之间通信的项目。在尝试使用AVR检查我的程序是否正常工作之前,我尝试通过终端模拟GSM模块,但是每当我输入由“gets”函数读取的字符串时,字符串都没有被正确捕获。我在阅读后尝试用“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
}
答案 0 :(得分:1)
这是错误的:
void readSerial(char *arr) {
gets(arr,sizeof(arr));
}
在您的AVR指针上有16位宽,因此sizeof(arr) == 2
。可以将sizeof
的字节长度作为附加参数传递给arr
,而不是使用readSerial()
。
答案 1 :(得分:1)
考虑将readSerial函数重写为:
void readSerial(char *arr, size_t array_size ){
gets(arr, array_size);
}
应该像这样调用函数:
char a[20] = {0};
readSerial( a, sizeof(a) );
在您的情况下,运算符的大小返回指向char(char *)的指针的大小而不是数组的大小。
答案 2 :(得分:0)
sizeof(arr)
== 2因为arr是char*
而不是数组。
C中的数组不是first class data types,不能传递给函数;而是传递指针并丢失数组大小信息。你需要单独传递长度。
void readSerial(char *arr, size_t len )
{
gets( arr, len ) ;
}
请注意,标准库gets()
在任何情况下都不会使用size参数。我假设这是一个非标准的实现。
另外,您的clear()
功能可以简化:
void clear(void)
{
while( getchar() != '\n' ) ;
}
虽然请注意,如果缓冲区已经为空,它将无限期地等待换行,所以在任何情况下都可能不是你想要的。