搜索
bottom↓
回复: 4

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

[复制链接]

出0入0汤圆

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

发送函数:
int UART_SendBuff(U8 ucComID,const U8 *pcBuff,U32 unLength)
{
        VU32 *unTRstat=NULL;
        VU8 *unTXH=NULL;
        U32  iSendCount=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];
               
                iSendCount++;
                unLength--;

        }

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


        return iSendCount;
}

接收函数:
int UART_RecvBuff(U8 ucComID,U8 *pcBuff,U32 unSize)
{
        VU32 *unTRstat=NULL;
        VU8 *unRXH=NULL;
        U32  iRecvCount=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[iRecvCount]!='\0')
          {
                iRecvCount++;
          }
          if(iRecvCount == unSize)
          {
                  return FAIL;
          }

           pcBuff[iRecvCount]=*unRXH;

   
           return iRecvCount;
}

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

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

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2010-12-3 09:16:51 | 显示全部楼层
调试器是把双刃剑。。。
你把UTRSTAT0 从watch window 撤掉看看
每单步调试一次,调试器本身就会把watch window里的所有变量读取一遍,效果和程序本身读取是一样的

出0入0汤圆

发表于 2010-12-3 09:18:01 | 显示全部楼层
还有URXH0这个也撤了试试

出0入0汤圆

 楼主| 发表于 2010-12-3 11:13:21 | 显示全部楼层
你是说在程序调试时  不对 URXH0 和 UTRSTAT0操作?

出0入0汤圆

发表于 2010-12-4 12:21:51 | 显示全部楼层
我的意思是调试的时候不要在MDK里面把这些变量放在观察窗口观察它们的值,也不要把鼠标悬停在变量上看它的值
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-20 23:16

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表