esniaw 发表于 2012-4-29 16:10:08

串口中断的疑惑




我想用串口来接收PC机的数据,接收到数据后点亮LED1,然后把接收到的数据通过UART0发送回去。
开发板的串口接收和发送用的都是中断方式。
用ADS编译出来BIN文件,下载到开发板后,重新上电,在PC的SecureCRT上按下a,开发板上的LED1被点亮了,PC机也显示了a。
问题是:如果PC上按键速度太快(连续按键)的话,只有第一次的按键可以点亮LED1(PC机也收到了开发板的反馈),以后在PC机上再按任何按键都没有反应了--LED1不亮,PC机也收不到反馈。
谁知道原因的话,麻烦告知,谢谢了。

cepoly 发表于 2012-4-29 18:23:57

本帖最后由 cepoly 于 2012-4-29 18:35 编辑

void __irq Uart0_Isr(void)
{
      unsigned char buf ;

      if(rSUBSRCPND & (1 << 1))//发送中断
      {
                rSUBSRCPND |= 1 << 1 ;
      }

      if(rSUBSRCPND & (1 << 0))//接收中断
      {
                buf = rURXH0 ;
                rSUBSRCPND |= 1 << 0 ;//清除接收中断
                rUTXH0 = buf ;
                Led1_On() ; Delay1s();Led1_Off() ;
      }
      
      rSRCPND |= 1 << 28 ;
      rINTPND |= 1 << 28 ;
}
这里出现问题。。。

你的程序里面没有用到串口控制led灯 ,你的程序是这样的,如果串口接收到数据,无论是什么数据,它就进入
Led1_On() ; Delay1s();Led1_Off() ; 打开灯,这样灯一直都是 Led1_On() ; Delay1s();Led1_Off() ;

                buf = rURXH0 ;
                rSUBSRCPND |= 1 << 0 ;//清除接收中断
                rUTXH0 = buf ;
                Led1_On() ; Delay1s();Led1_Off() ;
这里写的不好。。。因为你 buf = rURXH0 ; 接收到数据 ,你就清除接收中断,等待下次接收, rUTXH0 = buf ; 还来不及接收,buf里的数据又更新了。。。所以按得快就出现以上情况。。。总之这个程序不是很好 字符串是通不过的。。。。

esniaw 发表于 2012-4-29 22:56:25

      if(rSUBSRCPND & (1 << 0))//接收中断
   {
               buf = rURXH0 ;
               rUTXH0 = buf ;
               Led1_On() ; Delay1s();Led1_Off() ;
               rSUBSRCPND |= 1 << 0 ;//清除接收中断
         }
这样改了之后,还是有同样的问题。

esniaw 发表于 2012-5-5 18:38:12

找到问题了:s3c2440收到串口数据后,点亮LED1,在执行Delay1s();过程中,收到了下一个字符,但是buf = rURXH0 ;已经执行过了,所以新的数据会留在rURXH0寄存器中,并置位rSUBSRCPND寄存器中的接收中断标志位,但是随后执行的rSUBSRCPND = 1 << 0 ;会把这个标志位清除掉,然后清除rSRCPND和rINTPND退出ISR;这样的话,第二次的串口中断就被(错误的)清除掉了,rURXH0中的数据没有被读取,导致后面的串口接收线RXDn线上的数据不能进入,从而不会再进入串口ISR的接收中断处理了。

谢谢cepoly的回复:)

jing007520 发表于 2012-6-13 10:53:46

esniaw 发表于 2012-5-5 18:38 static/image/common/back.gif
找到问题了:s3c2440收到串口数据后,点亮LED1,在执行Delay1s();过程中,收到了下一个字符,但是buf = rUR ...

你好,我看你的程序应该是用的王小强出版的arm处理器裸机开发实战那本书上的吧?这本书貌似很多程序都有问题,不知道是不是我调试的问题还是怎么的?

esniaw 发表于 2012-7-8 10:23:18

jing007520 发表于 2012-6-13 10:53 static/image/common/back.gif
你好,我看你的程序应该是用的王小强出版的arm处理器裸机开发实战那本书上的吧?这本书貌似很多程序都有问 ...

是王小强的那本书,我用的是光盘里exercise目录下的文件。
直接用好像是有些问题,要改nand.h这个文件:
#define CMD_READ                        0x00        //Read
#define CMD_READ1                        0x01        //Read1
#define CMD_READ2                        0x50        //Read2
#define CMD_READ3                        0x30        //Read3---这里是针对K9F2G08UOB而言的,页内没有分为两部分,所以用这个指令即可;
改成
#define CMD_READ                        0x00        //Read
#define CMD_READ1                        0x00        //Read1
#define CMD_READ2                        0x30        //Read2
#define CMD_READ3                        0x30        //Read3---这里是针对K9F2G08UOB而言的,页内没有分为两部分,所以用这个指令即可;
页: [1]
查看完整版本: 串口中断的疑惑