本帖最后由 ARM_Lover 于 2011-8-16 12:54 编辑
我不知到这到底是是为什么?莫非KeilC有BUG?我想那可能行太小了。但我还是不知道到底是为什么?请那位高高手指点一二!我想知道此问题的一定是高手中的高手!程序原本很大,但是最后我把原因缩小到最小,把程序压缩到了最小,以便各位高手方便查阅!另外需要说明的是,如果吧所有的idata去掉的话,就没有该问题了!:dizzy:
大家可以用任何一个51开发板(如果不是STC11F08XE系列,只需要吧串口初始化略加修改便是了!)都可以进行测试,结果会让你们大吃一惊!原来、可以这样。至于你们信不信,反正我是信了!
对了,你需要吧中断0 引脚与串口接收引脚接起来!我的硬件就那样设计的!
#include "STC11F.H"
#include "config.h"
sbit LED =P0^3;
bit flag_modle0 = 0;
uint8 idata REBUF[20];
uint8 idata data_buffer[20] = "0123456789\n";
//串口初始化
void SerialInit(void)
{
AUXR = 0x11; //STC11F08XE配置
BRT = 0xFD; //启用独立波特率发生器
SCON = 0x50; //工作方式为1,允许接受
PCON = 0x00; //SMOD=0
}
//中断初始化
void InterruptInit(void)
{
IT0 = 1;
EX0 = 1;
AUXR1 = 0x00;
EA = 1;
}
//发送一个字节
void SendByte(const uint8 byte)
{
SBUF = byte;
while(TI == 0);
TI = 0;
}
//从idata区域,发送一个字符串
void SendStr(const uint8 idata * ptr)
{
while(*ptr != '\0')
{
SBUF = *ptr;
while(TI == 0);
TI = 0;
ptr++;
}
}
//获取一个字符串,如“::000300!” ,并存放在idata区域里
uint8 * Gets(uint8 idata *str)
{
while(1)
{
while(RI == 0);
RI = 0;
if(SBUF == '!'){
*str = SBUF;
str++;
*str = '\0';
break;
}
*str = SBUF;
str++;
}
return str;
}
void Puts(uint8 code * ptr)
{
while(*ptr != '\0'){
SBUF = *ptr;
while(TI == 0);
TI = 0;
ptr++;
}
}
//中断0
void Int0() interrupt 0 using 1
{
EX0 = 0;
AUXR1 = 0x00;
if(flag_modle0 == 0) //如果发送模式未定,进入未知接受状态
{
while(RI == 0);
RI = 0;
if(SBUF == ':')
{
uint8 idata *sp = REBUF;
uint8 idata *ep = Gets(sp);
LED = ~LED;
//输入字符串::000300!
//SendStr(strp++)能够正常执行,但是SendByte(*sp)发送结果为'\0',输出"\nCommand Error!\n"
// SendByte(*sp);
// SendByte(*(sp+1));
// SendByte(*(sp+2));
//SendStr(strp++)能够正常执行,SendStr(sp+1) 与SendStr(sp+2)的发送结果与输入的结果一样。
// SendStr(sp+1);
// SendStr(sp+2);
// SendStr(sp+3);
//SendStr(strp++)没有发送结果,SendStr(sp+1)没有发送结果,输出"\nCommand Error!\n"
// SendStr(sp++);
// SendStr(sp++);
// SendStr(sp++);
if(*sp == ':') //:: /ip/mod/boad/!
Puts("Command Right!\n");
else
Puts("\nCommand Error!\n");
}
IE0 = 0;
EX0 = 1;
}
}
void main(void)
{
uint8 *strp = data_buffer;
SerialInit();
InterruptInit();
SendStr(strp++);
SendStr(strp++);
SendStr(strp++);
SendStr(strp++);
while(1);
}
|