0

我正在尝试将我的诺基亚 N95 与 Proteus 接口。它几乎可以正常工作,除了一件事。当我想从调制解调器获得响应时,我使用unsigned char input[20]and scanf("%s",input)。当调制解调器收到呼叫时,它会发送RING到端口,但我得到的scanfRIGor RNG。可能是什么问题?

#include <regx51.h>
#include <stdio.h>
#include <string.h>


sbit TE = P2^4;//for transmitting
unsigned char ch;
unsigned char ch2;

long i;
short bakar=0;

unsigned char Command_AT[]="AT\r";

unsigned char xdata Command_CPIN[]="AT+CPIN =\"0000\"\r"; 

unsigned char Command_CMGF[]="AT+CMGF=1\r"; 

unsigned char Command_CMGS[]="AT+CMGS =\"5555\"\r"; 

unsigned char msg_report[]="Ok";

unsigned char CtrlZ=0x1A;                   

unsigned char xdata Status_Ok[]="AT\rOK";

unsigned char Command_CHUP[]="AT+CHUP\r";

unsigned char input[10];


void iniSerial()
{
    TMOD=0x20;  
    TH1=0XFD;
    SCON=0x50;
    TR1=1;
    TI=1;
    RI=0;
}
void delay() 
{
    for(i=1;i<=30000;i++); //Dont know how much exactly
}
void delay2()
{
    for(i=1;i<=50000;i++);
}
void sendDeliveryReport() 
{

    puts(Command_AT);
    delay();
    puts(Command_CMGF);
    delay();
    puts(Command_CMGS);
    delay();
    puts(msg_report);
    while(TI == 0);
    SBUF = 0x1A;
}
void checkRing()
{
    while(bakar!=1)
    {
        scanf("%s",&input);//problem is here

        if(strcmp(input,"RING") == 0)
        {
            bakar=1;
            delay();
            puts(Command_CHUP);
        }
        delay2();               
    }
}
void main()
{
    delay2();   //Wait for GSM modem to start.
    TE=1;       //Don't trasmit yet
    iniSerial();
    checkRing();
    TE=0;
    iniSerial();
    sendDeliveryReport();
    while(1);   //Pause forever
}
4

3 回答 3

6

该代码真的可以编译吗?void checkRing() 中的 if 语句的括号不匹配。

附言。对不起“答案”而不是评论,但我的声誉不允许评论。

于 2013-01-28T09:49:43.597 回答
2

你的线路

scanf("%s",&input);

完全是错误的。一个好的编译器应该会告诉你是否有不错的警告级别。

&input是 类型的unsigned char (*)[10],即指向unsigned char数组的指针。利用

scanf("%s",input);

反而。这里input衰减到 a ,如果您期望的是真正的字符串而不是任意数据unsigned char*,这就是您想要的。如果您的数据可能包含 0 个字节,则必须使用或等效的东西。read

编辑:如果您的输入确实是字符串,请使用char而不是unsigned char.

于 2013-01-28T09:16:03.127 回答
2

我必须说这段代码似乎会招致黑客攻击。

该行将scanf("%s",&input);字节读取到换行符为止,然后将其读取到堆栈上的缓冲区中。如果读取的字节数超过 10 个,则缓冲区溢出并且堆栈损坏。
从那里,覆盖返回地址和执行任意代码的方法很短。

您必须使用fgets,它允许您限制读取的字节数,然后fscanf在分隔符处停止,或者使用 Daniel Fischer 建议的格式字符串"%9s",它不会在缓冲区中存储超过 10 个字节(9 +终止空)。

于 2013-01-28T10:15:36.313 回答