xdata使用的问题
时间:10-02
整理:3721RD
点击:
我在用51控制摄像头拍照,定义了一个数组photo_buf[8000]为xdata类型,编译可以通过,但是按键发送读图像长度指令时,无法读出来:当我把 “uint8 xdata photo_buf[8000];//图像缓冲区”这句消隐了后,就可以,请问高手给看看是什么问题。是不是xdata使用的问题吖?
程序如下:
#include<reg52.h>
typedef unsigned char uint8;
typedef unsigned int uint32;
#include<string.h>
#include<intrins.h>
#define RST 0x01
#define BEGIN 0x04 //仪表数据开始读
#define STOP 0x05 //仪表数据结束读
//unsigned char ch,tmp[];
bit TXflag=0;
sbit K1=P3^1;
sbit K2=P3^2;
sbit LED=P0^0;
sbit LED1=P0^1;
sbit LED2=P0^2;
sbit LED3=P0^3;
sbit LED4=P0^4;
sbit LED5=P0^5;
sbit LED6=P0^6;
sbit LED7=P0^7;
uint32 photo_len=0;//图像的长度
uint8 xdata photo_buf[8000];//图像缓冲区
uint8 xdata table_dat[13];
uint8 xdata table_receive[16];
uint8 ReceiveLength=0;
uint8 ReadMark=0;//读取串口数据记录的位置
uint8 DatLength=0;//数据长度标志
uint8 ReadFlag;//读串口标志
uint32 EndFlag=250;
uint8 get_photo_cmd[]=
{0x56,0x00,0x32,0x0C,0x00,0x0A,
0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,
0x00,0xFF//这个时间间隔要注意,应该设大一点,而不是设小一点,设小一点的话数据来得太快就容易出现接收错误
};
uint8 get_photo_rcv[]=
{
0x76,
0x00,
0x32,
0x00,
0x00
};
uint8 read_len_cmd[]={0x56,0x00,0x34,0x01,0x00};//读长度命令
uint8 read_len_rcv[]={0x76,0x00,0x34,0x00,0x04,0x00,0x00};//读长度返回命令的前七个字节,返回命令的后两个字节为图像长度
void delay(unsigned char xms)
{
unsigned int i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void init()
{
ReadFlag=RST;
SCON=0x50;
TMOD=0x20;
PCON=0x80;//
TH1=0xfd; //晶振11.0592MHZ,SMOD=1,波特率19200bps 如果晶振为22.1184NHZ时,波特率为38400
IE|=0x90;
TR1=1;
//
}
void send(unsigned char *buf,unsigned char n)
{
unsigned char i;
ES=0;
for(i=0;i<n;i++)
{
SBUF=buf[i];
while(TI==0);
TI=0;
}
ES=1;
TXflag=1;
}
void ser() interrupt 4
{
if(RI)
{
RI=0;
table_receive[ReceiveLength]=SBUF;
ReceiveLength=++ReceiveLength&0x1f;
}
}
void receive_listtable(uint8 *table)//读串口缓存数据
{
while(ReadMark!=ReceiveLength)//若缓存数据有变化,则进入
{
table[DatLength]=table_receive[ReadMark];
table[DatLength+1]='\n';
DatLength++;
ReadMark=++ReadMark&0x1f;
EndFlag=100;
ReadFlag=BEGIN;
}
if(ReadFlag==BEGIN)
{
if(EndFlag==0)
{
DatLength=0;
ReadFlag=STOP;//yizu数据读取结束
}
else
{
EndFlag--;
}
}
}
void set_photo_len(uint8 length1,uint8 length2)
{
get_photo_cmd[12]=length1;
get_photo_cmd[13]=length2;
photo_len=length1*0x100+length2;
LED4=0;
}
void main()
{
init();
while(1)
{
if(K2==0)
{
delay(10);
if(K2==0)
{
send(read_len_cmd,5);//发读长度指令
LED=0;
while(K2==0);
}
}
delay(100);
ES=0;
receive_listtable(table_dat);// 返回读长度
if(ReadFlag==STOP)
{
LED1=0;
ReadFlag=RST;
delay(100);
if((table_dat[0]!=0x76)||(table_dat[1]!=0x00)||(table_dat[2]!=0x34)||(table_dat[3]!=0x00)||(table_dat[4]!=0x04)||(table_dat[5]!=0x00)||(table_dat[6]!=0x00))
{
LED2=0;//如果返回的指令不一致,LED2就亮,用来判断是否返回正确指令
return;
}
else if((table_dat[0]==0x76)&&(table_dat[1]==0x00)&&(table_dat[2]==0x34)&&(table_dat[3]==0x00)&&(table_dat[4]==0x04)&&(table_dat[5]==0x00)&&(table_dat[6]==0x00))
{
LED2=1;//如果返回的指令一致,LED2就灭,LED3亮,用来判断是否返回正确指令
LED3=0;
set_photo_len(table_dat[7],table_dat[8]);//设置读长度命令
delay(10000);
LED3=1;
}
}
ES=1;
}
}
程序如下:
#include<reg52.h>
typedef unsigned char uint8;
typedef unsigned int uint32;
#include<string.h>
#include<intrins.h>
#define RST 0x01
#define BEGIN 0x04 //仪表数据开始读
#define STOP 0x05 //仪表数据结束读
//unsigned char ch,tmp[];
bit TXflag=0;
sbit K1=P3^1;
sbit K2=P3^2;
sbit LED=P0^0;
sbit LED1=P0^1;
sbit LED2=P0^2;
sbit LED3=P0^3;
sbit LED4=P0^4;
sbit LED5=P0^5;
sbit LED6=P0^6;
sbit LED7=P0^7;
uint32 photo_len=0;//图像的长度
uint8 xdata photo_buf[8000];//图像缓冲区
uint8 xdata table_dat[13];
uint8 xdata table_receive[16];
uint8 ReceiveLength=0;
uint8 ReadMark=0;//读取串口数据记录的位置
uint8 DatLength=0;//数据长度标志
uint8 ReadFlag;//读串口标志
uint32 EndFlag=250;
uint8 get_photo_cmd[]=
{0x56,0x00,0x32,0x0C,0x00,0x0A,
0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,
0x00,0xFF//这个时间间隔要注意,应该设大一点,而不是设小一点,设小一点的话数据来得太快就容易出现接收错误
};
uint8 get_photo_rcv[]=
{
0x76,
0x00,
0x32,
0x00,
0x00
};
uint8 read_len_cmd[]={0x56,0x00,0x34,0x01,0x00};//读长度命令
uint8 read_len_rcv[]={0x76,0x00,0x34,0x00,0x04,0x00,0x00};//读长度返回命令的前七个字节,返回命令的后两个字节为图像长度
void delay(unsigned char xms)
{
unsigned int i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void init()
{
ReadFlag=RST;
SCON=0x50;
TMOD=0x20;
PCON=0x80;//
TH1=0xfd; //晶振11.0592MHZ,SMOD=1,波特率19200bps 如果晶振为22.1184NHZ时,波特率为38400
IE|=0x90;
TR1=1;
//
}
void send(unsigned char *buf,unsigned char n)
{
unsigned char i;
ES=0;
for(i=0;i<n;i++)
{
SBUF=buf[i];
while(TI==0);
TI=0;
}
ES=1;
TXflag=1;
}
void ser() interrupt 4
{
if(RI)
{
RI=0;
table_receive[ReceiveLength]=SBUF;
ReceiveLength=++ReceiveLength&0x1f;
}
}
void receive_listtable(uint8 *table)//读串口缓存数据
{
while(ReadMark!=ReceiveLength)//若缓存数据有变化,则进入
{
table[DatLength]=table_receive[ReadMark];
table[DatLength+1]='\n';
DatLength++;
ReadMark=++ReadMark&0x1f;
EndFlag=100;
ReadFlag=BEGIN;
}
if(ReadFlag==BEGIN)
{
if(EndFlag==0)
{
DatLength=0;
ReadFlag=STOP;//yizu数据读取结束
}
else
{
EndFlag--;
}
}
}
void set_photo_len(uint8 length1,uint8 length2)
{
get_photo_cmd[12]=length1;
get_photo_cmd[13]=length2;
photo_len=length1*0x100+length2;
LED4=0;
}
void main()
{
init();
while(1)
{
if(K2==0)
{
delay(10);
if(K2==0)
{
send(read_len_cmd,5);//发读长度指令
LED=0;
while(K2==0);
}
}
delay(100);
ES=0;
receive_listtable(table_dat);// 返回读长度
if(ReadFlag==STOP)
{
LED1=0;
ReadFlag=RST;
delay(100);
if((table_dat[0]!=0x76)||(table_dat[1]!=0x00)||(table_dat[2]!=0x34)||(table_dat[3]!=0x00)||(table_dat[4]!=0x04)||(table_dat[5]!=0x00)||(table_dat[6]!=0x00))
{
LED2=0;//如果返回的指令不一致,LED2就亮,用来判断是否返回正确指令
return;
}
else if((table_dat[0]==0x76)&&(table_dat[1]==0x00)&&(table_dat[2]==0x34)&&(table_dat[3]==0x00)&&(table_dat[4]==0x04)&&(table_dat[5]==0x00)&&(table_dat[6]==0x00))
{
LED2=1;//如果返回的指令一致,LED2就灭,LED3亮,用来判断是否返回正确指令
LED3=0;
set_photo_len(table_dat[7],table_dat[8]);//设置读长度命令
delay(10000);
LED3=1;
}
}
ES=1;
}
}