Board logo

标题: SCI 中断接收字符串问题 [打印本页]

作者: zhudongpo    时间: 2006-4-7 10:32     标题: SCI 中断接收字符串问题

#pragma  CODE_SEG __NEAR_SEG NON_BANKED


interrupt 20 void SCI0_interrupt(void)
{
    while(SCI0SR1_RDRF)
    {
         inbuf1[count3]=ch;
         count3++;
         if( (count3==(INBUF_LEN-1))
             {
               flag=1;  //如果串口接收的数据达到INBUF_LEN个,且校验没错,就置位取数标志                                
             }       
    } 


}
#pragma CODE_SEG  DEFAULT


void main(void)
{
  /* put your own code here */
  init_sci();
  init_io();   
  EnableInterrupts;
  for(;;)
  {
     if(flag)  //如果取数标志已置位,就将读到的数从串口发出
     {
        flag=0; //取数标志清0
        send_string_com(inbuf1,INBUF_LEN);
     }
  } /* wait forever */
}


我想实现通过串口发送一串数字,比如“11 22 33 44”,SCI串口接收(中断)和发送例程,可

以用来测试单片机的中断接收,可是老是不正确(中断只能进入1次),例如

我用串口助手发送了“11 22 33 44”,会接收到“11 22 33 44”,可是第二次发送“11 22 33 44”,就没有接收到数据。邵贝贝的书中说要清中断服务后用RTI作中断返回,可是没有RTI指令,CW不认呀, 麻烦各位给看看,那里有问题?谢谢了


 

[此贴子已经被作者于2006-4-7 10:32:22编辑过]


作者: seuafu2005    时间: 2006-4-7 11:26

你的程序只有接收中断,没有发送中断,你怎么发送出去的?
RTI是汇编的中断服务返回指令,用C语言编写的话,函数加interrupt就会自动使用RTI返回了
作者: xiaoxiaoer    时间: 2006-4-7 11:51

你的中断服务程序中没有清楚中断标志位,就是SCI0SR1_RDRF需要软件清零的。否则,MCU 一直认为中断正在处理,不会再进入中断的 。
请看手册如何清除中断标志位。
作者: BORNJIANG    时间: 2006-4-7 12:46

you are right
作者: zhudongpo    时间: 2006-4-7 17:34

seuafu2005 发送使用
void send_string_com(U_char *address,U_char n)
{
U_char i;
SCI0CR2_RE=0; //接收禁止
SCI0CR2_TE=1; //发送允许
for(i=0;i {
while(!SCI0SR1_TC);
while(!SCI0SR1_TDRE);
SCI0DRL=*address;
delay(1); // 延时
}
SCI0CR2_TE=0; //发送禁止

}
不用发送中断。

xiaoxiaoer
Clear RDRF by reading SCI status register 1 (SCISR1) with RDRF set and then reading SCI data register low 不用自己清的。

作者: seuafu2005    时间: 2006-4-10 11:41

你的发送程序中禁止了接收,但是发送完成后没有看见放开接收的设置
作者: fjczd    时间: 2009-2-9 09:35

参考学习一下


作者: fjczd    时间: 2009-2-10 13:56

可以用PE生成代码

参考如下

void AS1_OnRxChar(void)
{
/* Write your code here ... */
//datai=2;
sFlag='T';
//for(;data!='D';) { // 没有接收到字符‘D',程序就一直等待 通讯协议为"R02C05D"
if(AS1_GetCharsInRxBuf()!=0){
AS1_RecvChar(&data);
string[datai]=data;
datai++;
AS1_SendChar(data);
}
//}
data=0;
R1=string[1]-48;
R2=string[2]-48;
myR=R1*10+R2; //行
C1=string[4]-48;
C2=string[5]-48;
myC=C1*10+C2;//列
iNum=myR*100+myC;
// datai=0;
}






欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0