微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > xdata使用的问题

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;
}
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top