打印

xdata使用的问题

[复制链接]
4318|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hbdxzn|  楼主 | 2013-1-12 16:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我在用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;
}
}

相关帖子

沙发
信雪神话| | 2013-1-12 17:05 | 只看该作者
虽然不知道楼主说了社么~但感觉楼主很厉害的样子

使用特权

评论回复
板凳
ayb_ice| | 2013-1-13 08:03 | 只看该作者
MCU是否真实有这个空间呢,是否内部,还是外部,

使用特权

评论回复
地板
ZG11211| | 2013-1-13 11:16 | 只看该作者
哪款单片机的xdata有8000这么大?

使用特权

评论回复
5
leokingwen| | 2013-4-13 20:15 | 只看该作者
我也遇到类似问题,不知楼主解决问题了没有,想请教一下

使用特权

评论回复
6
sfesdm| | 2013-4-14 00:24 | 只看该作者
是否有外部的xdata区?如果没有的话,超出了内部的扩展1k xdata区,当然会出错了。

使用特权

评论回复
7
luling5897| | 2013-4-14 08:57 | 只看该作者
sfesdm 发表于 2013-4-14 00:24
是否有外部的xdata区?如果没有的话,超出了内部的扩展1k xdata区,当然会出错了。 ...

+1

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

13

帖子

0

粉丝