#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)接收到的字符数组将转换为字符串,但无法与可用字符串进行比较。 请仔细阅读该程序
答案 0 :(得分:0)
初学者的一个明显错误 - 改变:
unsigned char a[2][11]={"$0016221826","$0123456789"};
为:
unsigned char a[2][12]={"$0016221826","$0123456789"};
(你需要为每个字符串中的终止'\0'
留出空间 - 我很惊讶你的编译器没有抱怨这个?)
此外,中断处理程序中的这一行是错误的:
chr[11] = SBUF;
这个问题有几个问题 - char
只有11个字符的存储空间,而不是12个,你可能想要从索引0累积字符然后碰撞索引,否则你只是覆盖了相同的字符时间。
看看剩下的代码还有很多其他的问题,我认为你可能需要在这里退一步,从一个更简单的程序开始 - 首先运行然后分阶段添加它。
您可能还希望获得一本关于C的正确入门书并对其进行研究,因为代码中存在许多非常基本的错误,因此您可以从更好地理解语言本身中受益。
答案 1 :(得分:0)
您只为chr[11]
分配一个值,数组的其余部分未初始化并包含随机数据。然后将包含随机数据的数组复制到c
(您可以在这里使用例如memcpy
而不是自己循环),最后比较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;
}