我正在尝试将我的诺基亚N95与Proteus连接。除了一件事,它几乎没用。当我想从调制解调器获得响应时,我使用unsigned char input[20]
和scanf("%s",input)
。当调制解调器收到呼叫时,它会将RING
发送到该端口,但我scanf
获得的是RIG
或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
}
答案 0 :(得分:6)
这段代码真的可以编译吗? void checkRing()中的if语句具有不匹配的paranthesis。
PS。很抱歉“回答”而非评论,但我的声誉不允许发表评论。
答案 1 :(得分:2)
你的行
scanf("%s",&input);
完全错了。如果你有合适的警告级别,一个好的编译器应该告诉你。
&input
的类型为unsigned char (*)[10]
,它是指向unsigned char
数组的指针。使用
scanf("%s",input);
代替。这里input
衰减为unsigned char*
,这与你想要的是什么如果你期望的实际上是一个字符串而不是任意数据。如果您的数据可能包含0个字节,则必须使用read
或等效的数据。
编辑:如果您的输入真的是一个字符串,请使用char
代替unsigned char
。
答案 2 :(得分:2)
我必须说这段代码似乎引起了黑客攻击。
行scanf("%s",&input);
读取字节直到换行符进入堆栈中的缓冲区。如果读取的字节数超过10个,则缓冲区溢出,堆栈损坏
从那里开始,覆盖返回地址和执行任意代码的方法很短。
您必须使用fgets
,它允许您限制读取的字节数,然后fscanf
停止在分隔符处,或者使用(如Daniel Fischer建议的那样)格式字符串{{ 1}}它不会在缓冲区中存储超过10个字节(9 +终止空)。