写了一个串口接收的 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条回答
liufabing
1楼-- · 2019-12-24 10:39
同一个数组不就是同一个数据么.
可能会存在读的时间,中断里又修改了(你不确定中断什么时候发生).
t3486784401
2楼-- · 2019-12-24 14:52
yyliu 发表于 2016-8-15 17:23
他们操作的只是同一个数组,但不是同一个数据啊~~

随便看看 US1_RX_FIFO_user 就公用了,类似还会有  siz 那个,一个访问到一半被另一个中断改掉了,就是这么样
pazulin
3楼-- · 2019-12-24 19:15
这个有bug的,明显US1_RX_FIFO_user 这个变量就是冲突所在,根本不需要这个变量。head和tail的差值就cnt,看看linux的kfifo
shangdawei
4楼-- · 2019-12-24 20:21
 精彩回答 2  元偷偷看……
188089942
5楼-- · 2019-12-24 22:18
shangdawei 发表于 2016-8-16 02:04
linux内核数据结构之kfifo

http://www.cnblogs.com/Anker/p/3481373.html

非常感谢
AlertTao
6楼-- · 2019-12-25 02:02
我好像遇到类似问题:先将引脚配置为USART功能,再初始化USART,顺序问题。
楼主试一下。

一周热门 更多>