当前位置: 代码迷 >> 单片机 >> STC89C52 串口发送XDATA区域数据很奇怪的有关问题!
  详细解决方案

STC89C52 串口发送XDATA区域数据很奇怪的有关问题!

热度:113   发布时间:2016-04-28 16:13:19.0
STC89C52 串口发送XDATA区域数据很奇怪的问题!~
我用串口发送一个数组,发送函数如下:
void Uart_Init() //初始化UART
{
SCON =0x58; //选择串口工作方式,打开接收允许
TMOD|=0x20; //定时器1工作在方式2,
TH1 =0xfd; //实现波特率9600(系统时钟11.0592MHZ)
TL1=0xfd;
PCON |= 0x80; //实现波特率倍增 
TR1 =1; //启动定时器T1
ES=1; //允许串行口中断
PS=1; //设计串行口中断优先级
EA =1; //单片机中断允许
}
///初始化没有问题。

void UART_SendData(unsigned char *data_buf,unsigned int iCount)//发送程序
{
bit es;
iUartSendLen = iCount-1;
es=ES;
ES=0;//关闭中断
for(iSendCounter=0;iSendCounter<=iUartSendLen;iSendCounter++)
{
TI=0;
SBUF = data_buf[iSendCounter];
while(!TI);
TI=0;
}
ES=es;
}//这个函数测试也没有问题

void SendDataToWifi(unsigned char *cCommandPara,unsigned char iLength)
{  
unsigned char xdata cBuf[300]; //需要发送数据的数组 注意问题就在这行  
cBuf[0] = 0x01; // 同步字段31 5f 33 5f 32 33 34
cBuf[1] = 0x02; // 控制字段 
cBuf[2]=(iLength+1)>>8;
cBuf[3]=(iLength+1)&0x00ff;
cBuf[4]=GetCrc8(&cBuf[1],3);
memcpy(&cBuf[5],cCommandPara,iLength);
UART_SendData(cBuf,iLength+12); 
}

当我定义下面的这个结构接收串口数据的时候,串口发送出去的内容全部变成了 OX02
typedef struct Buffer2
{
unsigned char gcATReceData[300];  
unsigned int gcATReceCount;
} Buffer2;
struct Buffer2 xdata ATReceBuffer[1];//这里也必须把数组定义到XDATA里面

现在问题是:
当我把
unsigned char xdata cBuf[300];
改成
unsigned char cBuf[50]; 

发送和接收都正常,
但由于一次发送的内容比较多,必须把变量定义到 XDATA空间里面。。
我该怎么解决这个问题?

------解决方案--------------------
STC可用的xdata空间有多大?你可以再试试定义unsigned char xdata cBuf[50]; 试试效果如何,看发送正常不?

凌晨3点多,呵呵,人人都在睡觉呢,,,,
------解决方案--------------------
探讨
问题终于解决了。。原来unsigned char xdata cBuf[300];这句话不能在函数里面声明,必须声明为全局变量,我估计可能是在编译的时候,由于有两个XDATA的变量,如果一个是全局变量,一个是局部变量的话,就会导致编译器,自动分配内存的时候出错。。