http://www.5i51arm.com/viewthread.php?tid=403&highlight
发表于 2007-1-16 10:24 资料 短消息 |
请教一个串口收发程序!
实现每接受一个数据,就发送0x01出去的功能,调试出来的结果是:接受到底一个数据,发送出0x01,但是后面 不管接收了多少,没有数据发送出去了。请大家帮我看看,谢谢!源程序 如下:
#include #include
bit flag; int i;
InitiateUarts() { //set the RCLK and TCLK to use the Baud Rate Generator for serial 0 and serial 1 RCLK=1; TCLK=1;
//set the PCON.6/SMOD=0 to make sure that //bit 7 of S0CON and S1CON will function as SM0 for UARTs 0 and 1 respectively. PCON=0x00; //disable the multiprocessor communication SM2_0=0; SM2_1=0;
//set mode 3 for serial 0 SM0_0=1; SM0_1=1;
//set mode 3 for serial 1 SM1_0=1; SM1_1=1;
//enable serial 0 reception REN_0=1; REN_1=1;
//set the baud rate to 9600, using Baud Rate Generator BRGCON=0x02; BRGR0=0xD2; BRGR1=0x04; BRGCON=0x03;
//set the priority of serial 0 to the highest level "11" PS0=1; // == IP0.4=1 IP0H=0x10;
//set the priority of serial 1 to the highest level "11" PS1=1; IP1H=0x01; }
Serial_0() interrupt 6 using 1 { if(RI_0) { flag=1; RI_0=0; //clear the flag of serial 0 interrupt }
}
function() { if(flag) { S0BUF=0x01; flag=0; } //for(i=0;i<1000;i++); }
main() { //enable the Uarts 0 and 1 interrupts
//initiate the uarts 0 and 1 InitiateUarts(); EA=1; IEN0=0x90; IEN1=0x01;
while(1) function(); } |
这个问题很简单,虽然菜农没用过669,但道理是一样的~~~
在51系列和任意MCU/ARM/DSP中,串口一般都有发送和接收中断.
其中:
接收中断是在串口接收到一个字符后(这里不说带FIFO的串口).
RI=1将激活串口的接收中断.
进入中断服务程序ISR()后,应该立即取出数据!!!
同时也要求清除RI=0.
这样才能保证下次接收中断的来临,否则就再也进入不了下次的中断了.
同理,发送中断也是如此,但它可以不再发送字符.
因为TI=1引发中断只是告诉你刚发送出去的字符发送成功了.
本例中楼主应用了前后台的设计思路,这样中断处理的时间会很小的.
楼主的设计实际在接收中断里发送数据.
但从以上的论述,即使接收数据无用也应该读出(哪怕无用!!!),要养成这个好习惯.
这样用到其他的MCU或ARM/DSP时就会很快的掌握的.
这是菜农的首次回帖,本来应该由老树或其他斑竹回复的,这样论坛才有生气~~~
否则就倒塌了~~~
文章评论(0条评论)
登录后参与讨论