Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ AVR微控制器只读取两个字符_C++_C_Microcontroller_Avr_Gsm - Fatal编程技术网

C++ AVR微控制器只读取两个字符

C++ AVR微控制器只读取两个字符,c++,c,microcontroller,avr,gsm,C++,C,Microcontroller,Avr,Gsm,我正在做一个项目,涉及GSM模块和ATMEGA328P之间的通信。在实际使用AVR检查我的程序是否正常工作之前,我尝试通过终端模拟GSM模块,但是每当我输入由“gets”函数读取的字符串时,该字符串都不会被正确捕获。我在阅读后尝试用“printf”显示它,它只显示前两个字符。知道为什么会这样吗?我尝试在键入以下字符串后清空缓冲区:“while((ch=getchar())!='\n');以避免出现问题,因为我必须读取多个值,每当我键入时,我都会像GSM模块那样附加CR+LF以进行应答 以下是代码

我正在做一个项目,涉及GSM模块和ATMEGA328P之间的通信。在实际使用AVR检查我的程序是否正常工作之前,我尝试通过终端模拟GSM模块,但是每当我输入由“gets”函数读取的字符串时,该字符串都不会被正确捕获。我在阅读后尝试用“printf”显示它,它只显示前两个字符。知道为什么会这样吗?我尝试在键入以下字符串后清空缓冲区:“while((ch=getchar())!='\n');以避免出现问题,因为我必须读取多个值,每当我键入时,我都会像GSM模块那样附加CR+LF以进行应答

以下是代码的一部分:

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
}    
这是错误的:

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

在AVR上,指针的宽度为16位,因此
sizeof(arr)==2
。与其使用
sizeof
,不如传入
arr
的字节长度作为
readSerial()
的附加参数,考虑将readSerial函数重写为:

void readSerial(char *arr, size_t array_size ){
    gets(arr, array_size);
}
函数的调用方式如下:

char a[20] = {0};
readSerial( a, sizeof(a) );
在您的例子中,size of运算符返回指向字符的指针的大小(char*),而不是数组的大小。

sizeof(arr)
==2,因为arr是
char*
而不是数组

C中的数组不是也不能传递给函数;而是传递指针,数组大小信息丢失。您需要单独传递长度

void readSerial(char *arr, size_t len )
{
    gets( arr, len ) ;
}
请注意,标准库
gets()
在任何情况下都不接受大小参数。我假设这是一个非标准实现

另外,您的
clear()
功能可以简化:

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

但是请注意,如果缓冲区已经为空,它将无限期地等待新行,因此在任何情况下都可能不是您想要的。

sizeof(arr)
并不是你想象的那样-它只是给你指针本身的大小,而不是它指向的缓冲区的大小。你需要为缓冲区大小传递一个额外的参数。这个
在哪里定义了
函数?在C标准库中有一个,或者更确切地说是一个同名函数,但它只需要一个argument.(在C11中被删除,因为它不能安全使用。)如果可能的话,我建议给它一个不同的名称,以避免对人类读者以及可能的编译器和/或链接器造成混淆。您希望
sizeof
实现魔法。gets()的奇怪之处虽然在AVR Libc参考手册中只显示了一个参数,但在CodeVision中,如果我不输入数组的长度,我会收到错误消息“函数调用中的几个参数”。我的CodeVision Libc版本可能有点旧吗?酷!我猜sizeof()是多少实际上读取的是指针的大小,正如本文其他答案中所述。gets()的奇怪之处在于,尽管在AVR Libc参考手册中,它只显示了一个参数,但在CodeVision中,我收到了错误消息“函数调用中的几个参数”“如果我没有设置数组的长度。不管怎样,现在它工作了,谢谢!但是sizeof(a)仍然只给出数组中第一个元素的大小,还是我错了?无论如何,额外的参数解决方案就像一个魅力!谢谢@不,sizeof(a)给出了整个数组所占用的字节数
sizeof(a[0])
将给出第一个元素占用的字节数
sizeof(a)/sizeof(a[0])
是获取数组中元素数的常用习惯用法,但由于数组是
char
sizeof(char)==1(根据定义),因此在这种情况下没有必要。