搜索
bottom↓
回复: 3

马老师请教您一个有关串口发送与接收的问题(不是知道是不是AVR的BUG)

[复制链接]

出0入0汤圆

发表于 2007-6-30 09:49:11 | 显示全部楼层 |阅读模式
当我在主程序里循环发送数据时,接受中断怎么不能及时响应,而是在所有数据都完全发送完以后才可以响应中断,





这是AVR自身决定的还是,在程序里需要一些特殊的设置吗?



谢谢您!

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

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2007-6-30 13:15:09 | 显示全部楼层
AVR的USART硬件本身支持全双工工作,也就是说,硬件本身可以实现同时的发送和接收。



而在实际使用中,同时发送和接收就不是那么简单了,因为你的软件需要及时对发送和接收的数据进行处理的。如果软件编写的不合理,不能及时的处理发送和接收的数据,不能跟上硬件的速度,那么就会发生问题,如丢失接收的数据等。



因此在一般性的应用中,建议你使用半双工方式,这样软件编写的难度相对小些,容易实现。

出0入0汤圆

 楼主| 发表于 2007-7-2 08:49:10 | 显示全部楼层
马老师我在主程序一直写发送一个数据,一共发送一千个,但是这期间我从上位机向AVR128发送数据,但是在这一千数据发送中,是不响应接受中断的,这是为什么??



void init_devices(void)

{

   CLI();

   XDIV  = 0x00;

   XMCRA = 0x00;

   port_init();

   uart0_init();

   MCUCR =0x00;

   EICRA =0x00;

   EIMSK =0x50;//EIMSK =0x50;

   EICRB =0x11;//EICRB =0x11;

   TIMSK =0x05;// TIMSK =0x05;

   ETIMSK =0x04;

   SEI();

}

//////////////////////////////////////////////////////////////////

//                                                              

//LCD切换显示子程序

//

//////////////////////////////////////////////////////////////////  

void timer0_init(void)

{

TCCR0 = 0x00; //stop

ASSR  = 0x00; //set async mode

TCNT0 = 0x16; //set count

OCR0  = 0xEA;

//TCCR0 = 0x07;//start timer

}

/*/////////////////////////////////////////////////////////////

//串口初始化程序

//

//发送子程序

//



////////////////////////////////////////////////////////////*/

void uart0_init(void)

{

     UCSR0B = 0x00; //disable while setting baud rate

     UCSR0A = 0x00;

     UCSR0C = 0x06;

     UBRR0L = 0x19; //set baud rate lo

     UBRR0H = 0x00; //set baud rate hi

     UCSR0B = 0x98;

}

//

void USART_Transmit(unsigned int data)

{ //SEI();

     while(!(UCSR0A&0x20));   //等待发送缓冲器空,UDRE0数据寄存器空标志

     

        UDR0=data;               //发送数据,将被发送数据付给UDR0数据寄存器

}

//

#pragma interrupt_handler uart0_rx_isr:19

void uart0_rx_isr(void)

{



  unsigned char i;

  v1++;

  i=UDR0;

       

USART_Transmit(v1);

}

///////////////////////////////////////////////////////////////////////////////

//

//TIMER3 initialize - prescale:1024

// WGM: 0) Normal, TOP=0xFFFF

// desired value: 1Sec

// actual value:  1.000Sec (0.0%)

//

///////////////////////////////////////////////////////////////////////////////



//

//



void main(void)

{   

          int sum;

          int i;

         qwer=5;

          v1=0;

          sum=0;

         init_devices();

         

         

     while(1)

     {



         if(sum<1000)

           {

       

              USART_Transmit('0');

           sum++;}

            

         

         

   }

}

出0入0汤圆

发表于 2007-7-12 13:45:35 | 显示全部楼层
void USART_Transmit(unsigned int data)函数中的while循环后不应该加“;”号。最好用串口接收和发送中断处理来做。看不到你timer0在哪里被使用。而且也没有定时器中断的处理。好像定时器初始化的设置也有问题 。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-7-23 02:31

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

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