0

Nokia N95 を Proteus と接続しようとしています。1つのことを除いて、ほとんど問題なく動作します。モデムからの応答を得たいときは、 と を使用unsigned char input[20]scanf("%s",input)ます。モデムがコールを受信するとRING、ポートに送信されますが、得られるのscanfRIGまたは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 ステートメントの括弧が一致していません。

ps。コメントではなく「回答」で申し訳ありませんが、私の評判ではコメントは許可されていません。

于 2013-01-28T09:49:43.597 に答える
2

このコードはハッカーの攻撃を誘うようだと言わざるを得ません。

scanf("%s",&input);は改行までのバイトをスタック上のバ​​ッファに読み込みます。10 バイトを超える読み取りが行われると、バッファーがオーバーフローし、スタックが破損します。
そこからリターンアドレスを上書きして任意のコードを実行するまでの道のりは短いです。

読み取りバイト数を制限できる を使用fgetsし、続いて区切り文字で停止するか、Daniel Fischer が提案したように、バッファに 10 バイトを超えて保存しないfscanfフォーマット文字列(9 + "%9s"null を終了します)。

于 2013-01-28T10:15:36.313 に答える
2

あなたのライン

scanf("%s",&input);

は単純に間違っています。適切な警告レベルがあるかどうかは、優れたコンパイラが教えてくれるはずです。

&inputunsigned char (*)[10]、つまりunsigned char配列へのポインタです。使用する

scanf("%s",input);

代わりは。これは、期待するものが実際に文字列であり、任意のデータではない場合に必要なものinputですデータに 0 バイトが含まれている可能性がある場合は、または同等のものを使用する必要があります。unsigned char*read

編集:入力が実際に文字列の場合は、char代わりにunsigned char.

于 2013-01-28T09:16:03.127 に答える