写了一个串口接收的 FIFO ,一直都看不出有什么问题!

2019-12-23 18:38发布

bsp_US1_RX_int (u8 Data)       这一条是串口接收中断的时候调用,并把出带入。
bsp_US1_RX    (u8 * Data)      这一条是取出缓冲区的数据

现在问题是这样的,是不是的数据会丢一两个位,并且丢了之后,以后收到的数据都会出现错位!
正确的应该是  0123456789  ,但错位后收到的数据  5012345678。  



u16     bsp_US1_RX       (u8 * Data)
{   
    short temp=0;
    while(US1_RX_FIFO_user)
    {
        *Data++ = US1_RX_FIFO[US1_RX_FIFO_tail++];              
        if(US1_RX_FIFO_tail == US1_RX_FIFO_Siz)     
            US1_RX_FIFO_tail = 0;                  
        US1_RX_FIFO_user--;

        temp++;
    }
   
    return temp;
}
inline s8      bsp_US1_RX_int   (u8 Data)
{   
    if(US1_RX_FIFO_Siz - US1_RX_FIFO_user -1 )
    {
        US1_RX_FIFO[US1_RX_FIFO_head++] = Data;      
        if(US1_RX_FIFO_head == US1_RX_FIFO_Siz)     
            US1_RX_FIFO_head = 0;                  
        US1_RX_FIFO_user++;
    }
    else
    {
        return RXbuff_overflow;
    }
   
    return 0;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
30条回答
circle_head
1楼-- · 2019-12-26 18:37
 精彩回答 2  元偷偷看……
holdkcsxym
2楼-- · 2019-12-26 22:29
学了几招,感谢各位分享
dso_2012
3楼-- · 2019-12-26 23:40
US1_RX_FIFO_user   确实不能用,我之前这样用过,程序长时间跑就会丢数据,后面只判断 head tail 就OK了
rube
4楼-- · 2019-12-27 05:31
我的,简单易懂:
#define UART0_FIFO_SIZE        12
typedef struct  
{
        volatile uint8 in;
        volatile uint8 out;
        uint8 fifo[UART0_FIFO_SIZE];
}UART_FIFO;                                       

UART_FIFO uart0;

void uart0_fifopush(int8 dat)
{
          uart0.fifo[uart0.in] = dat;
          if (uart0.in < (UART0_FIFO_SIZE - 1)) uart0.in++;        //判断队列是否已满
          else uart0.in = 0;        //队列满,覆盖头部
}
int8 uart0_fifopop(void)
{
            int8 tmp = uart0.fifo[uart0.out];
        if (uart0.out < (UART0_FIFO_SIZE - 1)) uart0.out++;
        else uart0.out = 0;
        return tmp;
       
}
yanyanyan168
5楼-- · 2019-12-27 07:21
rube 发表于 2016-10-9 09:46
我的,简单易懂:
#define UART0_FIFO_SIZE        12
typedef struct  

好的,谢谢
su33691
6楼-- · 2019-12-27 08:14
 精彩回答 2  元偷偷看……

一周热门 更多>