12tangyang12 发表于 2014-7-9 21:57:20

有关 串口中断问题。。。。。。

先上程序段如下:
#include<iom88.h>
#include<intrinsics.h>
#include<comp_a90.h>
#include"main.h"

uchar RX_Buffer = 0;
void Delay(uint del)
{
uint i=0,j=0;
for(i=0;i<del;i++)
    for(j=0;j<1000;j++)
      ;
}

void USART0_Init(void)
{
   UCSR0B = 1<<7|1<<4|1<<3;//使能接收中断,接收,发送使能
   UCSR0C = 0X06;
   UBRR0H = 0;
   UBRR0L = 207;//2400 bps
   
}

void USART_Send_Data(uchar *Data)
{                                                         //发送数据
while(*Data)
{
    UDR0 = *Data++;
    while(!(UCSR0A&0X40));
    UCSR0A |= 0X40;   
}

}
void main(void)
{
DDRD_Bit2 = 1;
USART0_Init();
_SEI();
while(1)
{
    USART_Send_Data("你好。\r\n");
    PORTD_Bit2 = ~PORTD_Bit2;
    Delay(1500);
}
}

#pragma vector =USART_RX_vect
__interrupt void USART_RX(void)
{

RX_Buffer = UDR0;
if(RX_Buffer == 0x01)
{
    USART_Send_Data("收到!");
}
}
描述如下:准备做个串口实验,单片机上电后就不停的向串口输出 “你好”。 当上位机向单片机 发送“0x01” 单片机则
转入 串口接收中断, 在接收中断里 发送“收到”。发送完后,继续不停的发送”你好“。
问题:当单片机正想上位机发送”你好“的时候,上位机向单片机发送0x01,单片机只能回复”收到“。不能继续发送”你好“,原本主循环中闪烁的灯也不
闪烁了。求解,这是怎么回事。

uindex 发表于 2014-7-9 22:40:06

应该是死在中断里面了,在中断处理函数内CLRRI再试。

12tangyang12 发表于 2014-7-10 13:47:38

uindex 发表于 2014-7-9 22:40
应该是死在中断里面了,在中断处理函数内CLRRI再试。

中断函数里“收到”还是可以发送的,就是发送了返回不到主循环了,这是不是说明中断返回的时候出了点问题?

qlb1234 发表于 2014-7-10 14:08:47

我覺得這箇問題提得不錯,不過還有一點點可以改進。
1. 將一大段程序放在最後,並用代碼功能包圍起來。
2. 描述和問題的斷行有點詭異,建議修改下。
3. 標點符號斷句有點不是很恰當。比如雙引號甚麼的。
4. 問題的最開始似乎有問題。“当单片机正想上位机发送”你好“的时候”。看不出有甚麼關聯。
5. 如果你曾經嘗試去解決這箇問題,可以描述一下,你都做過些甚麼,又看見了甚麼現象。

uindex 发表于 2014-7-10 19:06:03

12tangyang12 发表于 2014-7-10 13:47
中断函数里“收到”还是可以发送的,就是发送了返回不到主循环了,这是不是说明中断返回的时候出了点问题 ...

是啊,没看到清除RX中断,结果应该是RX中断一直来,再也回不到主程序循环了。
页: [1]
查看完整版本: 有关 串口中断问题。。。。。。