打印

奇怪

[复制链接]
1090|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
又一歪歪|  楼主 | 2008-10-30 22:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
se, ST, start, vi, ic
高手帮我看看程序错在哪里,为什么第一次数据能发送出去,第二次就发不出去了
void __irq InterUart0()
{
   
    if((U0IIR&0x02)!=0) 
    {    
        if(in_send)
        {
            U0THR = outbuff[send_num++];;  
            if(send_num>=send_total)
            {
                 in_send = 0;
            }
        }
    }   
    else 
    {
        rec_flag = 1;  //接受标志置一
        inbuff[in_num++] = U0RBR;
        if(in_num>=MAX_IN)
        {
            in_num = 0;
        }
    }
    VICVectAddr = 0; 
}

void SendStart() //启动发送
{
    U0THR = outbuff[0];
    //while( (U0LSR&0x40)==0);  
    send_num = 1;
    send_total = send_ptr-outbuff;//计算发送数据总数
    in_send = 1;
}

void SendToBuffStart()
{
    while(in_send==1); // 等待串口发送完
    send_ptr = outbuff;// 发送指针复位
}
 
void InitUart0(void)
{
       unsigned int fdiv;
       VICIntSelect  =   0x00;  //设置所有中断为IRQ方式
    VICIntEnable  =   1<<6;  //使能串口中断
    VICVectAddr1  =  (uint32)InterUart0; //设置串口中断地址
         VICVectCntl1  =   0x26;  //分配到IRQ1
    ////////////////////
       
    U0LCR = 0X83;   //允许访问除数寄存器
    fdiv = (Fpclk/16)/9600; //
    U0DLM = fdiv>>8;
    U0DLL = fdiv&0xff;
    
    U0FCR = 0x01; 
    U0LCR = 0x03;
    U0IER = 0x03;    //必须在DLAB==0时,访问
    
}

void main(void)
{
         PINSEL0 |= 0x05;    
    
    IRQEnable(); //IRQ     
         InitUart0();

         SendToBuffStart(); 
         *send_ptr++ = 0x30;
         *send_ptr++ = 0x30;
         *send_ptr++ = 0x30;
         *send_ptr++ = 0x30;
         SendStart();      //发送第一次数据

         SendToBuffStart(); //程序停在这了,奇快,发送完数据就应该清
                            //掉in_send了啊
         *send_ptr++ = 0x30;
         *send_ptr++ = 0x30;
         *send_ptr++ = 0x30;
         *send_ptr++ = 0x30;
         SendStart();   //发送第二次数据
}

相关帖子

沙发
又一歪歪|  楼主 | 2008-10-31 00:14 | 只看该作者

问题终于解决了

问题已解决。
在中断中会改变的全局变量前要加VOLATILE 关键字,以防止编译器优化。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

61

帖子

0

粉丝