串口中断的疑问

请问ch57X 的串口中断,如果接收到的数据长度和FIFO设置的一样,是不是只能进入UART_II_RECV_RDY,而不会触发UART_II_RECV_TOUT?

那这样的话UART_II_RECV_TOUT这个中断感觉并没有什么用啊?


我的串口初始化配置:

```

    /* 配置UART3 */

    GPIOA_SetBits( GPIO_Pin_5 );

    GPIOA_ModeCfg( GPIO_Pin_4, GPIO_ModeIN_PU );                   // RXD-配置上拉输入

    GPIOA_ModeCfg( GPIO_Pin_5, GPIO_ModeOut_PP_5mA );              // TXD-配置推挽输出,注意先让IO口输出高电平

    UART3_DefInit(  );

    UART3_BaudRateCfg( 9600 );

    UART3_ByteTrigCfg( UART_7BYTE_TRIG );

    UART3_INTCfg( ENABLE, RB_IER_RECV_RDY );

    PFIC_EnableIRQ( UART3_IRQn );


    UART3_Data.RxCount = 0;

```

我的中断接收:

```

__attribute__( ( interrupt( "WCH-Interrupt-fast" ) ) )

__attribute__( ( section( ".highcode" ) ) )

void UART3_IRQHandler( void )

{

    switch ( UART3_GetITFlag(  ) )

    {

        case UART_II_RECV_RDY :              // 数据达到设置触发点

            UART3_Data.RxCount += UART3_RecvString( UART3_Data.RxBuff+UART3_Data.RxCount );     // 拷贝数据

            break;

        case UART_II_RECV_TOUT :           // 接收超时,暂时一帧数据接收完成

            UART3_Data.RxCount += UART3_RecvString( UART3_Data.RxBuff+UART3_Data.RxCount );     // 拷贝结尾数据

            UART3_Logic_Handler(  );

            UART3_Data.RxCount = 0;

            break;

        default :

            break;

    }

}

```


这个代码的效果是如果接受到的数据长度是 7 的整数倍,那只会进入 UART_II_RECV_RDY 中断,

其他情况,如果小于7字节会进入 UART_II_RECV_TOUT 中断。

如果大于7字节则会在接收完毕之前进入n次UART_II_RECV_RDY 中断,最后再进入一次UART_II_RECV_TOUT 中断。


请问7字节及其整数倍的时候只能自己判断是不是接受完毕吗?那UART_II_RECV_TOUT中断没有意义啊?

这个UART_II_RECV_TOUT产生的前提是fifo里面有数据,

你可以在UART_II_RECV_RDY中断里留一个数据在fifo里,这样就可以保证每次都能产生 UART_II_RECV_TOUT


在主贴提供的代码中,代码" UART3_ByteTrigCfg( UART_7BYTE_TRIG ); "的作用是:

当串口硬件RX fifo中的数据达到7字节时候,将产生UART_II_RECV_RDY 中断,

换句话说,只有当该串口的硬件RX FIFO 大于等于7字节才会产生该中断,

如果一次接收, 前面的数据已经在UART_II_RECV_RDY中取走,剩下的硬件RX FIFO里仍然有数据,而又连续4个byte的时间不再接收到数据进来, 即会在触发UART_II_RECV_TOUT

此时读取硬件RX FIFO 里的数据方法与UART_II_RECV_RDY 一致.



UART_II_RECV_TOUT和UART_II_RECV_RDY一样处理就行了,TOUT并不是必现的中断而已。


只有登录才能回复,可以选择微信账号登录