打印
[AVR单片机]

USART 使用有轮询方式和中断方式?有什么区别,

[复制链接]
4684|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lwking412|  楼主 | 2008-5-12 13:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以下摘自艺芯的AVR GCC 编程 v1.1 
查询方式: 
/* MCU:AT90S2313 时钟:4MHz */ 
#include <avr/io.h> 
#define uchar unsigned char 
#define uint unsigned int 
//uart 发送一字节数据 
void putc(uchar c) 

loop_until_bit_is_set(UCR,UDRE); 
UDR=c; 

//uart 等待并接收一字节数据 
uchar getc(void) 

loop_until_bit_is_set(UCR,RXC); 
return UDR; 

int main(void) 

//uart 初始化 
UCR=(1<<RXEN)|(1<<TXEN); 
UBRR=25; //baud=9600 UBRR=CK/(baud*16) -1 
while(1) 

putc(getc()); 


程序从UART 等待接收一字节,接收到数据后立即将数据又从UART 发送回去。 
中断方式: 
/* MCU:AT90S2313 时钟:4MHz */ 
芯 艺 作 品 
27 
#include <avr/io.h> 
#include <avr/interrupt.h> 
#include <avr/signal.h> 
#define uchar unsigned char 
#define uint unsigned int 
uchar g_bTxdPos=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; 
if(g_bRxdLen>0) 

g_aRecvBuf[g_bRxdPos++]=c; 
g_bRxdLen--; 


//发送中断 
SIGNAL (SIG_UART_TRANS) 

if(--g_bTxdLen>0) 
UDR=g_aSendBuf[++g_bTxdPos]; 

//是否接收完成 
uchar IsRecvComplete(void) 

return g_bRxdLen==0; 

//从发送缓冲区发送指定长度数据 
void SendToUart(uchar size) 

g_bTxdPos=0; 
g_bTxdLen=size; 
芯 艺 作 品 
28 
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 检测是否接收完成。 


我的问题是通常我们用查询还是中断方式啊,他们有什么区别呢,中断方式程序很多我看不懂吗,麻烦大家指教一下 
比如 
uchar g_bTxdPos=0; //发送定位计数器 
uchar g_bTxdLen=0; //等待发送字节数 
uchar g_bRxdPos=0; //接收定位计数器 
uchar g_bRxdLen=0; //等待接收字节数 
uchar g_aSendBuf[16]; //发送数据绶冲区 
uchar g_aRecvBuf[16]; //接收数据缓冲区 
这些命名是已经定义的还是自己定义的 
为何uchar g_bTxdPos=0; 就是//发送定位计数器呢? 
能不能告诉我看什么东西才能理解中断的程序啊  
就是说中断程序里这些函数我都不知道在那里有,代表什么含义,如果看头文件,应该怎么看,在哪个目录下啊? 
   

相关帖子

沙发
农民讲习所| | 2008-5-12 15:31 | 只看该作者

区别

就是XP下,你只能跑一个程序和许多程序的区别。

查询:就是傻等。
中断就是有事就做,无事就休息。

讲实时性,就是讲如何处理中断。
  

使用特权

评论回复
板凳
lwking412|  楼主 | 2008-5-12 18:32 | 只看该作者

非常感谢

谢谢

使用特权

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

本版积分规则

8

主题

32

帖子

0

粉丝