打印
[AVR单片机]

中断串口传输的程序还是看不懂(问题已经列在右边,麻烦大

[复制链接]
1397|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lwking412|  楼主 | 2008-5-12 22:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
中断方式:  
/* MCU:AT90S2313 时钟:4MHz */  
  
#include <avr/io.h>  
#include <avr/interrupt.h>  
#include <avr/signal.h>  
#define uchar unsigned char  
#define uint unsigned int  
uchar g_bTxdPos=0; //发送定位计数器                    问题1 为什么左边都是赋值为0啊 
uchar g_bTxdLen=0; //等待发送字节数  
uchar g_bRxdPos=0; //接收定位计数器  
uchar g_bRxdLen=0; //等待接收字节数  
uchar g_aSendBuf[16]; //发送数据绶冲区  
uchar g_aRecvBuf[16]; //接收数据缓冲区  
//接收中断  
SIGNAL(SIG_UART_RECV)  
{  
uchar c=UDR;           //问题2.通常都是把值赋给UDR,但uchar c=UDR是何意思 
if(g_bRxdLen>0)  
{  
g_aRecvBuf[g_bRxdPos++]=c; g_bRxdLen--;  
}  
}  
//发送中断  
SIGNAL (SIG_UART_TRANS)  
{  
if(--g_bTxdLen>0) //问题3,这一句什么意思啊,为什么要先减--呢?我认为是if(g_bTxdLen>0) 

UDR=g_aSendBuf[++g_bTxdPos]; //问题4为什么要++g_bTxdPos,我觉得应该同接收一样g_bTxdPos++望大家给我详细说说吧,实在看不懂 
}  
//是否接收完成  
uchar IsRecvComplete(void)  
{  
return g_bRxdLen==0;  
}  
//从发送缓冲区发送指定长度数据  
void SendToUart(uchar size)  
{  
g_bTxdPos=0;  
g_bTxdLen=size;  

UDR=g_aSendBuf[0];  
while(g_bTxdLen>0);  
}  
//接收指定长度数据到接收缓冲区  
void RecvFromUart(uchar size,uchar bwait)  
{  
g_bRxdPos=0;  
g_bRxdLen=size;  
if(bwait)  
while(g_bRxdLen>0);  
}  
int main( void )  
{  
uchar i;  
//uart 初始化  
//接收使能、发送使能、接收中断允许、发送中断允许  
UCR=(1<<RXCIE)|(1<<TXCIE)|(1<<RXEN)|(1<<TXEN);  
UBRR=25; // baud=9600 UBRR=CK/(baud*16) -1  
sei();//总中断允许  
while(1)  
{  
//异步接收16 字节数据  
RecvFromUart(16,0);  
//等待接收完成  
while(!IsRecvComplete());  
//将接收到的数据复制到发送缓冲区  
for(i=0;i<16;i++)  
g_aSendBuf=g_aRecvBuf;  
//发送回接收到的数据  
SendToUart(16);  
}  
}  
利用中断可实现数据的异步发送和接收,正如上面程序所示,调用RecvFromUart 后主  
程序可处理其它任务,在执行其它任务时可调用IsRecvComplete 检测是否接收完成。

相关帖子

沙发
dai_weis| | 2008-5-12 22:59 | 只看该作者

看来基本没有理解,包括基础C的内容

问题1:那些变量用来记录数据的信息的,初始的时候当然要做0初始化。
问题2:看好,仔细些,那个是接收,手册中有详细说明(看手册是还是不仔细,该打PP)UDR是一个根据读和写分别访问不同的发送缓冲区和接收缓冲区的内容,写入UDR则把数据写入发送缓冲区,读UDR是读取接收缓冲区
问题3:发送一个数据,就把数据长度减去一个,直到所有数据发送完毕(变成了0)
问题4:++在前和后在C中有描写,++在后是先取值运算,然后做+1

使用特权

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

本版积分规则

8

主题

32

帖子

0

粉丝