|
![](static/image/common/ico_lz.png)
楼主 |
发表于 2013-11-10 16:33:15
|
显示全部楼层
初始化后,继续。
再返回到uart.c中,先看一下变量
volatile unsigned char UartSendBuffer[OutLEN]; //发送缓冲
volatile unsigned char UartReceiveBuffer[InLEN]; //接收数据缓冲
volatile unsigned char *outlast=UartSendBuffer; //最后由中断传输出去的字节位置
volatile unsigned char *putlast=UartSendBuffer; //最后放入发送缓冲区的字节位置
volatile unsigned char UartSendBufferemptyFlag=1; //缓冲区数据发完标志 发完=1
volatile unsigned char UartSendBufferHaveDataFlag=0; //发送缓冲区非空标志 有=1
volatile unsigned char UartReceiveCounter=0; //接收计数器
volatile unsigned char UartRxTimerStartFlag=0; //接收超时计数器启动标志
volatile unsigned char UartWaitForCounter=0; //接收超时计数器
volatile unsigned char UartDataReadyFlag=0; //接收完成标志
********************************************************************
上面UartReceiveBuffer在FX1NProcessing函数多次使用,为了简洁,当时记为Buffer。变量名很多又太长,没有必要记,暂时只看一下变量名的末尾(红色),了解大概功能即可,等在具体代码中遇到再返回来确认。
// 函数名称: UartSendchar
//uart.c
// 功能描述:放入一个字节到发送缓冲区
//
// 输 入: unsigned char ucdata
//
// 输 出: void
void UartSendchar(unsigned char ucdata)
{
ES=0; // 暂停串行中断,以免数据比较时出错
while((((outlast-putlast)==2)&&(outlast > putlast ))||((outlast < putlast)&&(OutLEN-(putlast-outlast)==2)))
{
ES=1;
ucdata++;
ucdata--;
ES=0;
}
*putlast=ucdata; // 放字节进入缓冲区
putlast++; // 发送缓冲区指针加1
if (putlast==UartSendBuffer+OutLEN) putlast=UartSendBuffer; // 指针到了顶部换到底部
UartSendBufferHaveDataFlag=1;
if (UartSendBufferemptyFlag) // 缓冲区无数据
{
UartSendBufferemptyFlag =0;
SBUF=*outlast; // 未发送完继续发送
outlast++; // 最后传出去的字节位置加1
if (outlast==UartSendBuffer+OutLEN)outlast=UartSendBuffer; // 地址到顶部回到底部
if (putlast==outlast)UartSendBufferHaveDataFlag=0; // 数据发送完置发送缓冲区空标志
} // 缓冲区开始为空,置为有,启动发送
ES=1;
}
看来 UartSendchar是uart相关最复杂的函数,但要实现的功能从字面上就很好理解。
********************************************************************
按顺序理解,
ES=0; // 暂停串行中断,以免数据比较时出错
什么是ES?
// (bits in IE,定义在REG_MPC82G516.h中)
sbit EA = IE^7;
sbit ET2 = IE^5;
sbit ES = IE^4;
sbit ET1 = IE^3;
sbit EX1 = IE^2;
sbit ET0 = IE^1;
sbit EX0 = IE^0;
从定义上,和REG52.h中的定义一致,就是断开串口中断。下图左下角的开关。
while((((outlast-putlast)==2)&&(outlast > putlast ))||((outlast < putlast)&&(OutLEN-(putlast-outlast)==2)))
看来也许要再定义一个宏了,不过先理解一下,
最后由中断传输出去的字节位置 outlast
最后放入发送缓冲区的字节位置 putlast
要理解还需要看中断函数,因为outlast和putlast都是由中断函数赋值的。所以要理解一下中断函数后再返回。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|