tanguicaicai 发表于 2014-3-19 16:26:48

傻孩子老师 帮帮我看看,串口中断发送遇到的问题

先前发在 这里http://www.amobbs.com/thread-5573477-1-1.html



#define SEI_TX    UCSRB|=(1<<TXEN)|(1<<TXCIE)|(1<<UDRIE)//
#define CLI_TX    UCSRB&=~((1<<TXEN)|(1<<UDRIE)|(1<<TXCIE))//


u8 WriteDataToTxdBuff(u8 *Data,u8 Datalengt)
{
if((MY_UartTxdBuff.UartDataHead==MY_UartTxdBuff.UartDataTail)&&(MY_UartTxdBuff.UartDataCounter==UartTxdBuffSize))
    return 1;//缓冲区数据满返回1退出
if(Datalengt>(UartTxdBuffSize-MY_UartTxdBuff.UartDataCounter))
    return 1;//要接收的数据宽度不够
while(Datalengt--)
    {
         MY_UartTxdBuff.UartTxdBuf=*Data++;
         MY_UartTxdBuff.UartDataCounter++;
      }
if(MY_UartTxdBuff.UartDataHead>=UartTxdBuffSize)
    {
         MY_UartTxdBuff.UartDataHead=0;
      }
SEI_TX;
return 0;
}


ISR(USART_UDRE_vect)
{
if((MY_UartTxdBuff.UartDataHead==MY_UartTxdBuff.UartDataTail)&&(MY_UartTxdBuff.UartDataCounter==0))
   { CLI_TX;
   return;}//缓冲区数据空,可能性很少
UDR=MY_UartTxdBuff.UartTxdBuf;
MY_UartTxdBuff.UartDataCounter--;
if(MY_UartTxdBuff.UartDataTail>=UartTxdBuffSize)//
    {MY_UartTxdBuff.UartDataTail=0;
         }
else
SEI_TX;

}

ISR(USART_TXC_vect)
{
// CLI_TX;
}

while(1)
{
delay_ms(100);
WriteDataToTxdBuff(a,3);
delay_ms(100)

}

现在现象是 刚开机时发时时间和间隔都很正常,当发送200左右之后发送的速度就很快 完全没有时间间隔,全速发送数据都是a数组里面的数据 !
家里面有一本你的书 回去看看有没关于中断发送的
我看龙芯里面的例程 改了一下 也不行 连发都发不出去

tanguicaicai 发表于 2014-3-19 16:58:25

也数据不会发完 又自动循环所以 最后不会进入接收中断里面

tanguicaicai 发表于 2014-3-20 12:59:22

解决了~~

Gorgon_Meducer 发表于 2014-3-21 10:18:19

我还没来得及看……不好意思哈……

desireyao 发表于 2014-3-21 10:29:49

过来看看

vctor、南 发表于 2014-3-21 10:39:54

{:smile:}{:smile:}

nishuizhou 发表于 2014-3-21 11:25:16

Gorgon_Meducer 发表于 2014-3-21 10:18
我还没来得及看……不好意思哈……

你的书什么时候出版啊?呵呵

tanguicaicai 发表于 2014-3-21 16:14:58

Gorgon_Meducer 发表于 2014-3-21 10:18
我还没来得及看……不好意思哈……

谢谢啊!看你的书 我学到一个很重要的东西 那就是状态机!
页: [1]
查看完整版本: 傻孩子老师 帮帮我看看,串口中断发送遇到的问题