进入AVR微控制器只读取两个字符

时间:2014-11-03 07:52:45

标签: c++ c microcontroller avr gsm

我正在做一个涉及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
}    

3 个答案:

答案 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' ) ;
}

虽然请注意,如果缓冲区已经为空,它将无限期地等待换行,所以在任何情况下都可能不是你想要的。