-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

对于初学者来说一个明显的错误 - 更改:

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

至:

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

(您需要为'\0'每个字符串的终止留出空间 - 我很惊讶您的编译器没有抱怨这个?)

此外,您的中断处理程序中的这一行是错误的:

chr[11] = SBUF;

这有几个问题 -char只能存储 11 个字符,而不是 12 个字符,并且您可能希望从索引 0 累积字符,然后碰撞索引,否则您每次只是覆盖相同的字符。

查看其余代码,还有很多其他问题,我认为您可能需要退后一步,从一个更简单的程序开始——先让它工作,然后分阶段添加。

您可能还想获得一本不错的 C 入门书籍并学习它,因为代码中有很多非常基本的错误,因此您可能会从更好地理解语言本身中受益。

于 2012-08-31T09:34:51.117 回答
0

您只需为 分配一个值chr[11],数组的其余部分未初始化并将包含随机数据。然后,您将包含随机数据的这个数组复制到c(您可以在此处使用 egmemcpy而不是自己循环),最后将c(随机数据)的完整内容与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 回答