PIC 串口中断问题

2020-02-08 09:05发布

在PIC串口中断的时候只判断 (RCIE&&RCIF)==1,  就发送固定的一字符串(即只要有串口中断产生就发送数据,而不判断RCREG串口中断过来的数据是什么)

为何现在的情况是产生串口后不停地在发送数据,好像一直在产生中断,不停发送一样,但是PC 只是发送了一次数据

而判断RCREG的数据是否为设定的数据就不会出现上述问题
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
9条回答
Cortex_M3
2020-02-08 18:49
本帖最后由 Cortex_M3 于 2012-8-14 11:49 编辑

在中断中设置了一个标志,在主程序中查询此标志,标志有效后发送数据,但是串口无数据

直接在中断中发送就可以
望前辈们,赐教!

/***************************************************************************
* 功  能:串口调试助手发送数据'A',877收到后返回‘Tt is ok!’串口助手,设置波特率为9600BPS
****************************************************************************/
#include<pic.h>              //包含单片机内部资源预定义
__CONFIG(0x1832);
//芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,11.0592M晶体HS振荡
#define uchar unsigned char

void USART_transmit_onebyte(unsigned char byte);
void USART_transmit_string(unsigned char *p,unsigned char n);     

unsigned char RECEIVE;
unsigned char UASRT_FLAG=0;继续郁闷 在中断中设置一标志,在主程序中查询到这一标志,再发送字符串 无任何数据过来

但是直接再终端中发送就可以

贴上代码,望前辈们赐教!
unsigned char ch[11]={'I','t',' ','i','s',' ','o','k','!',0x0D,0x0A};

/****************************************************************************
* 名    称:main()
* 功    能:主函数
* 入口参数:无
* 出口参数:无
* 说    明:无
****************************************************************************/

void main()
{
  TRISC=0xC0;                  //设置C口方向全为输出
  SPBRG=0x47;                  //设置波特率为9600BPS
  TXSTA=0X24;                  //使能串口发送,选择高速波特率//TXEN=1;
  RCSTA=0X90;                  //使能串口工作,连续接收  //SPEN=1  CREN=1
  CREN= 1;                     //允许接收中断
  RCIE= 1;                     //使能接收中断
  TXEN= 1;                     //允许发送中断
  TXIE= 1;                     //使能发送中断
  GIE = 1;                     //开放全局中断
  PEIE= 1;                     //使能外部中断
  while(1)                     //等待中断
  {
   if(UASRT_FLAG==0x01)
   {
     UASRT_FLAG=0x00;
     USART_transmit_string(ch,11);
   }
  }
}

/****************************************************************************
* 名    称: USART_transmit_onebyte(unsigned char byte)
* 功    能: 串口发送函数
* 入口参数:
* 出口参数:
* 说    明:
****************************************************************************/
void USART_transmit_onebyte(unsigned char byte)
{
     TXREG = byte;
     while(!TRMT);
     //TRMT=1;
}

/****************************************************************************
* 名    称: USART_transmit
* 功    能: 串口发送
* 入口参数:
* 出口参数:
* 说    明:
****************************************************************************/
void USART_transmit_string(unsigned char *p,unsigned char n)
{
     while(n--)
     {
      USART_transmit_onebyte(*p);
      p++;
     }
}

/****************************************************************************
* 名    称: UASRT_ISR()
* 功    能:中断函数
* 入口参数:
* 出口参数:
* 说    明:注意要有关键字 interrupt 如果是多种中断,在中断服务函数中,
                        要判断中断源标志
****************************************************************************/
void interrupt UASRT_ISR(void)
{
   if(RCIE&&RCIF)            //判断是否为串口接收中断
   {
    //RCIF=0;
    RECEIVE=RCREG;           //把接收到的数据发送回去
    if(RECEIVE=='A')
    {
     UASRT_FLAG=0x01;
     //USART_transmit_string(ch,11);
    }
   }
   return;
}

一周热门 更多>