中断方式: /* 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 检测是否接收完成。
|