打印
[DemoCode下载]

ML51串口中断使用方法

[复制链接]
940|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
598330983|  楼主 | 2019-9-29 23:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*---------------------------------------------------------------------------------------------------------*/
/*                                                                                                         */
/* Copyright(c) 2019 Nuvoton Technology Corp. All rights reserved.                                         */
/*                                                                                                         */
/*---------------------------------------------------------------------------------------------------------*/

//***********************************************************************************************************
//  Website: http://www.nuvoton.com
//  E-Mail : MicroC-8bit@nuvoton.com
//***********************************************************************************************************

//***********************************************************************************************************
//  File Function: ML51 simple GPIO toggle out demo code
//***********************************************************************************************************

#include "ML51.h"
bit uart2rvflag=0;
unsigned char TXtemp=0x30;

void SMC0_ISR(void) interrupt 19          // Vector [url=home.php?mod=space&uid=72445]@[/url]  0x9B
{
   SFRS=0;
   if((SC0IS&SET_BIT0)==SET_BIT0)
   {
      TXtemp = SC0DR;
      clr_SC0IS_RDAIF;
       uart2rvflag = 1;
   }
}

/**
* [url=home.php?mod=space&uid=247401]@brief[/url]       UART2 TXD output demo
* @param       None
* [url=home.php?mod=space&uid=266161]@return[/url]      None
* [url=home.php?mod=space&uid=1543424]@Details[/url]     conned UART2 and UART0 to loop check.
*/

void main (void)
{
     MFP_P31_UART0_TXD;
    P31_QUASI_MODE;
    UART_Open(24000000,UART0_Timer1,115200);        /* Open UART0 use timer1 as baudrate generate and baud rate = 115200 */
  
     MFP_P55_UART2_RXD;
    P55_INPUT_MODE;
    UART_Open(24000000,UART2,115200);                /* Open UART2 use timer1 as baudrate generate and baud rate = 115200*/
    UART_Interrupt_Enable(UART2,Enable);
    ENABLE_GLOBAL_INTERRUPT;

/* Connect P5.5 and P3.1 to check loop  from UART0 to UART2*/
    UART_Send_Data(UART0,TXtemp);  
    while(1)
    {
      if (uart2rvflag)
      {
          TXtemp++;
          uart2rvflag=0;
          Timer3_Delay(24000000,4,300,1000);
          UART_Send_Data(UART0,TXtemp);  
      }
    }

}





使用特权

评论回复
沙发
598330983|  楼主 | 2019-9-29 23:33 | 只看该作者
这个例子展示了如何使用串口中断接收数据,如何在主函数读取串口中断接收的数据。

使用特权

评论回复
板凳
wahahaheihei| | 2019-9-30 11:49 | 只看该作者
会不会漏掉,比如主函数没处理到呢,就被新的覆盖了。

使用特权

评论回复
地板
wahahaheihei| | 2019-9-30 11:49 | 只看该作者
会不会漏掉,比如主函数没处理到呢,就被新的覆盖了。

使用特权

评论回复
5
yiy| | 2019-11-9 17:19 | 只看该作者
接收到触发。

使用特权

评论回复
6
xuanhuanzi| | 2019-11-10 16:17 | 只看该作者
这个操作思路可以。

使用特权

评论回复
7
643757107| | 2019-11-11 22:25 | 只看该作者
这个方式比扫描的更好吗

使用特权

评论回复
8
tianxj01| | 2019-11-12 09:37 | 只看该作者
643757107 发表于 2019-11-11 22:25
这个方式比扫描的更好吗

在已知的大多数情况下,中断处理都比查询出色,最关键的就在于资源的占用和实时时效。
对于串口中断,只发生在接受一个完整的数据或者数据发送完成这2个节点。由于采用中断,当级别足够高时候,则会在动作的第一时间相应中断。中断函数只需要在该2节点让程序干涉一下就行,比如及时的处理收到的数据,或者可以发起再一次发送。
如果采用查询,则为了保证不漏掉接受数据,查询密度就得很高,势必大量占用单片机运行时间资源。而对于发送,非中断则一般采用等待,就必须在发出发送指令后,一直等待数据发送完成,中间为了避免出错误,一般什么都别干了。
在这样对比,你觉得那种方式更好很合理呢?

使用特权

评论回复
9
643757107| | 2019-11-12 12:42 | 只看该作者
tianxj01 发表于 2019-11-12 09:37
在已知的大多数情况下,中断处理都比查询出色,最关键的就在于资源的占用和实时时效。
对于串口中断,只 ...

总结的到位,牛。

使用特权

评论回复
10
monitoring| | 2019-11-17 18:20 | 只看该作者
一般都是中断接收放BUFF,查询处理帧协议

使用特权

评论回复
11
xixi2017| | 2019-11-17 23:50 | 只看该作者
楼上说的好像是的。

使用特权

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

本版积分规则

245

主题

5383

帖子

22

粉丝