This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

UART6 fifo查询接收



我不太理解UART的FIFO,是什么样的工作机制?

1、接收FIFO接收到数据后,如何知道数据已经被CPU读取?

2、FIFO接收16字节,空间满了后,再接收数据的时候是自动覆盖原先的数据吗?

这是我使用查询方式,仅仅是把FIFO接收到的数据存到数组中,

void UART6_Recive_Done(void)

{
    uint8_t Recive_Date[255] = {0}, ii = 0;
    while(UARTCharsAvail(UART6_BASE))
    {
       Recive_Date[ii] = UARTCharGetNonBlocking(UART6_BASE);
       ii++;
    }
}

如何判断数据接收完,ii接收完一次数据如何归零?

希望大侠赐教!!!

  • int UART6_Recive_Done(void)
    {
    // uint8_t ii = 0;
    while(UARTCharsAvail(UART6_BASE))
    {
    Recive_Date[ii] = UARTCharGetNonBlocking(UART6_BASE);
    if(Recive_Date[0] == 0x01)
    {
    ii++;
    }
    else
    UARTDateSend((uint8_t *)"addrss is error \n ",16 );
    ii = 0;
    return 0;
    }
    date_length = Recive_Date[5];
    byte_length = (date_length<<1);
    return 1;
    }函数这样写的话就智能接收最后一个八位字节,不知道原因?

  • 1.可通过 UART 标志 (UARTFR) 寄存器(见 816页)和 UART 接收状态 (UARTRSR) 寄存器监控 FIFO的状态。而对空、满和溢出条件的监控则是由硬件来完成的。当接收FIFO满的时候,可以配置触发中断的,有个标志位。

    2.如果你不清除的话,应该是覆盖原来的数据的。

  • 1.FIFO使用机制都是类似的,可以在网上查看,http://blog.csdn.net/houqi02/article/details/51683635

    2.建议用FIFO中断处理方式,根据需求设定FIFO中断级位,SCIFFRX中的RXFFIL设置接收中断,cpu接收到一定数目的字符后去读FIFO中的数据,避免数据丢失。

  • 我知道了,当发送的数据超过FIFO设定的接收字节时,比如设定FIFO的深度是8字节,当发送18个字节时,就需要进入三次中断接收函数。

    但是,如何判断数据是否接收完了呢?想到了一种延时的方法,就是进一次中断给一个系统时间,主函数判断大于10ms再进行数据处理,这个办法每接收十几个数据帧后,会出现一个错误帧。

    想到的另一种方法是,只要UART在工作,就一直等待接收,但是接收不到数据,不知道哪想错了?

      uint32_t flag = UARTIntStatus(UART6_BASE,true);   

     UARTIntClear(UART6_BASE,flag);  

    while(UARTBusy(UART6_BASE))  

     {       

       MB.data_buffer[MB.countbuffer] = UARTCharGet(UART6_BASE);   

       MB.countbuffer++;

      }   

    MB.countstate = MB.countbuffer;   

    MB.countbuffer = 0;  

    MB.timecount = soft_timer;

  • 我知道了,当发送的数据超过FIFO设定的接收字节时,比如设定FIFO的深度是8字节,当发送18个字节时,就需要进入三次中断接收函数。

    但是,如何判断数据是否接收完了呢?想到了一种延时的方法,就是进一次中断给一个系统时间,主函数判断大于10ms再进行数据处理,这个办法每接收十几个数据帧后,会出现一个错误帧。

    想到的另一种方法是,只要UART在工作,就一直等待接收,但是接收不到数据,不知道哪想错了?

    uint32_t flag = UARTIntStatus(UART6_BASE,true);

    UARTIntClear(UART6_BASE,flag);

    while(UARTBusy(UART6_BASE))

    {

    MB.data_buffer[MB.countbuffer] = UARTCharGet(UART6_BASE);

    MB.countbuffer++;

    }

    MB.countstate = MB.countbuffer;

    MB.countbuffer = 0;

    MB.timecount = soft_timer;

  • 你这样做的话,当发送18个字节完毕的时候,不继续发送,导致FIFO的深度不够,永远也不触发第三次中断的。除非你的发送端一直发,只发送一次的话,就糟了。