-3
#include<reg51.h>
#include<string.h>
#include"_LCD_R8C.c"
unsigned char c[12];
unsigned char chr[11];
void serial_int (void) interrupt 4
{
  if (RI==1)      
  {
    chr[11] = SBUF;
    RI = 0;     
    TI = 0;     
  }
}

int main()
{
  unsigned char a[2][11]={"$0016221826","$0123456789"};
  int i,j;
  lcd_init();
  lcd_clear();
  SCON = 0x50;              
  TMOD = 0x20;                
  TH1  = 0xFD;                 
  ET0  = 0;                     
  TR1  = 1;                       
  RI   = 1;                   
  ES   = 1;                   
  EA   = 1;
  for(j=0;j<1;j++)
      {
       for(i=0;i<=10;i++)
       {
        c[i]=chr[i];
       }
     c[11]='\0';
     }                   
  for(i=0;i<=1;i++)
  {
    j=strcmp(a[i],c); /* !!! Here is the problem !!! */
    if(j==0)
     {
      lcd_printxy(1,1,"yes");
     }
    else
     {
      lcd_printxy(1,6,"no");
     }
 }
}

「いいえ」と表示されますが、何が問題なのか教えてください。問題は、1)受信した文字の配列が文字列に変換されていないか、2)受信した文字の配列が文字列に変換されているが、使用可能な文字列と比較できない可能性があります。プログラムを実行してください。

4

2 に答える 2

0

に値を割り当てるだけchr[11]で、残りの配列は初期化されておらず、ランダム データが含まれます。次に、ランダム データを含むこの配列を にコピーしc(たとえば、自分でループする代わりにここで使用できmemcpyます)、最後に の完全な内容c(ランダム データ) を のエントリの 1 つと比較しますa。したがって、その比較の結果、文字列が等しくないというのは当然のことです。

編集:問題のプログラムの再設計

あなたのプログラムには問題が多すぎて簡単に修正できないので、書き直してみることにしました。

#include <reg51.h>
#include <string.h>

#include "_LCD_R8C.c"

#define INPUT_LENGTH 11
#define ACCEPTABLE_INPUT_COUNT 2

char input[INPUT_LENGTH];  /* The input from the serial port */
int  input_pos  = 0;       /* Current position to write in the input buffer */
int  input_done = 0;       /* 0 = not done yet, 1 = all input read */

void serial_int (void) interrupt 4
{
    if (!input_done && RI == 1)
    {
        /* Put the input at next position in the input buffer */
        /* Then increase the position */
        input[input_pos++] = SBUF;

        RI = 0;
        TI = 0;

        /* Check if we have received all input yet */
        if (input_pos >= INPUT_LENGTH)
            input_done = 1;
    }
}

int main()
{
    /* Array of data that this programs thinks is acceptable */
    /* +1 to the input length, to fit the terminating '\0' character */
    char acceptable_inputs[ACCEPTABLE_INPUT_COUNT][INPUT_LENGTH + 1] = {
        "$0016221826", "$0123456789"
    };

    iny acceptable_found = 0;  /* Acceptable input found? */

    /* Initialization */
    lcd_init();
    lcd_clear();
    SCON = 0x50;              
    TMOD = 0x20;                
    TH1  = 0xFD;                 
    ET0  = 0;                     
    TR1  = 1;                       
    RI   = 1;                   
    ES   = 1;                   
    EA   = 1;

    /* Wait until we have received all input */
    while (!input_done)
        ;  /* Do nothing */

    /* Check the received input for something we accept */
    for (int i = 0; i < ACCEPTABLE_INPUT_COUNT; i++)
    {
        if (memcmp(acceptable_inputs[i], input, INPUT_LENGTH) == 0)
        {
            /* Yes, the data received is acceptable */
            acceptable_found = 1;
            break;  /* Don't have to check any more */
        }
    }

    if (acceptable_found)
        lcd_printxy(1, 1, "Yes");
    else
        lcd_printxy(1, 1, "No");

    return 0;
}
于 2012-08-31T09:40:26.783 に答える
0

初心者向けの明らかなバグ - 変更:

unsigned char a[2][11]={"$0016221826","$0123456789"};

に:

unsigned char a[2][12]={"$0016221826","$0123456789"};

(各文字列で終了するための余地を残す必要があり'\0'ます - コンパイラがこれについて文句を言わなかったことに驚きましたか?)

また、割り込みハンドラの次の行が間違っています。

chr[11] = SBUF;

これにはいくつかの問題がcharあります-12文字ではなく11文字のストレージしかありません。おそらく、インデックス0から文字を蓄積してからインデックスを増やしたいと思うでしょう。そうしないと、毎回同じ文字を上書きするだけです。

コードの残りの部分を見ると、他にも多くの問題があるため、ここで一歩戻って、より単純なプログラムから始める必要があると思います。最初にそれを機能させてから、段階的に追加します。

コードには非常に基本的な間違いがたくさんあるため、C に関する適切な入門書を入手して学習することもできます。そのため、言語自体をよりよく理解することで利益が得られる可能性があります。

于 2012-08-31T09:34:51.117 に答える