fengyuganyu 发表于 2010-12-3 01:23:58

关于S3C2440A的 中断串口接收问题,有点诡异

我的问题是这样的 ,我使用的串口中断触发 来接收数据,但是当我的发送一串数据时,就只能接受到一个数据,而我一个个分开发送时,就可以完整的回显,这是这么回事?
另一个问题是:我用MDK调试时 我发送的一个数据 触发了串口接受的中断,此时串口0的状态寄存器UTRSTAT0的 值是 0x07,这就代表有数据已经到了接受缓存区,当我跳入中端处理函数时 UTRSATA0就变为0X06,并且我接受缓存区的数据也没了,这就让我不明白了,我直接运行时干嘛可以直接回显,而调试时连接受都出问题,这个太诡异了 请高人指点,部分代码如下:

发送函数:
int UART_SendBuff(U8 ucComID,const U8 *pcBuff,U32 unLength)
{
        VU32 *unTRstat=NULL;
        VU8 *unTXH=NULL;
        U32iSendCount=0;
        switch(ucComID)
        {
                case 0: unTRstat = &rUTRSTAT0;
                                unTXH       = &rUTXH0;
                                break;
                case 1: unTRstat = &rUTRSTAT1;
                                unTXH       = &rUTXH1;
                                break;
                case 2: unTRstat = &rUTRSTAT2;
                                unTXH       = &rUTXH2;
                                break;
        }

        while(unLength)
        {

                while(!(*unTRstat & 0X04));
               
                        *unTXH =        pcBuff;
               
                iSendCount++;
                unLength--;

        }

        while(!(*unTRstat & (1<<2)));


        return iSendCount;
}

接收函数:
int UART_RecvBuff(U8 ucComID,U8 *pcBuff,U32 unSize)
{
        VU32 *unTRstat=NULL;
        VU8 *unRXH=NULL;
        U32iRecvCount=0;

        switch(ucComID)
        {
                case 0: unTRstat = &rUTRSTAT0;
                                unRXH       = &rURXH0;
                                break;
                case 1: unTRstat = &rUTRSTAT1;
                                unRXH       = &rURXH1;
                                break;
                case 2: unTRstat = &rUTRSTAT2;
                                unRXH       = &rURXH2;
                                break;
        }

   while(!(*unTRstat & 0x01));
   
          while(pcBuff!='\0')
          {
                iRecvCount++;
          }
          if(iRecvCount == unSize)
          {
                  return FAIL;
          }

           pcBuff=*unRXH;

   
           return iRecvCount;
}

这是中断的处理函数:
char UART_RXTest(void)
{
        static U8 pcBuff={0};
        static char i=0;
        UART_RecvBuff(0,pcBuff,15); //接受一个发送一个
        UART_SendBuff(0,pcBuff,1);
        pcBuff=0;
       
}
当我用MDK调试时,单步跳入这个函数时 状态寄存器 UTRSTAT0 的值就由原来的 0X07 变为 0X06,怎么回事?,难道中断只是通知,而你需要在外面轮训吗?这样中断还不如没有好直接轮训算了,

不知各位大侠 能否解释下 这是怎么回事?

yuhui 发表于 2010-12-3 09:16:51

调试器是把双刃剑。。。
你把UTRSTAT0 从watch window 撤掉看看
每单步调试一次,调试器本身就会把watch window里的所有变量读取一遍,效果和程序本身读取是一样的

yuhui 发表于 2010-12-3 09:18:01

还有URXH0这个也撤了试试

fengyuganyu 发表于 2010-12-3 11:13:21

你是说在程序调试时不对 URXH0 和 UTRSTAT0操作?

yuhui 发表于 2010-12-4 12:21:51

我的意思是调试的时候不要在MDK里面把这些变量放在观察窗口观察它们的值,也不要把鼠标悬停在变量上看它的值
页: [1]
查看完整版本: 关于S3C2440A的 中断串口接收问题,有点诡异