标题: 新手小白求解这个单片机C语言程序wptr &= 0x0f;是段什么意思? [打印本页]

作者: 松下手刹    时间: 2023-8-26 21:00
标题: 新手小白求解这个单片机C语言程序wptr &= 0x0f;是段什么意思?
void UART1_Isr() interrupt 4 using 1
{
    if (TI)                   // 发送中断标志位判断
    {
        TI = 0;               // 清中断标志
                busy = 0;             // 发送标志位置0,表示满足发送条件
        LED0 = !LED0;         // 测试端口
    }
    if (RI)                   // 接收中断标志位判断
    {
        RI = 0;               // 清中断标志
        LED1 = !LED1;         // 测试端口
                buffer[wptr++] = SBUF;
                wptr &= 0x0f;
    }
}

这个wptr &= 0x0f;是段什么意思?

作者: cnfloatleaf    时间: 2023-8-26 23:15
wptr = wptr & 0x0f;
作者: 1600277881    时间: 2023-8-27 00:08
让wptr在0至0x0F之间循环
作者: mdj-fish    时间: 2023-8-27 06:55
这个我也想问一下,为什么这样?
作者: mdj-fish    时间: 2023-8-27 06:58
也想知道是什么意思?
作者: angmall    时间: 2023-8-27 09:50
mdj-fish 发表于 2023-8-27 06:55
这个我也想问一下,为什么这样?

buffer[16] 是串口的缓冲区,长度是16个字节
是一个循环缓冲区(circular buffer)
循环缓冲区或环形缓冲区是一种数据结构,它使用单个固定大小的缓冲区,就好像它是端到端连接的一样。
这个 wptr &= 0x0f; 的意思是 让wptr在0至0x0F之间循环

作者: jniy    时间: 2023-8-27 10:15
angmall 发表于 2023-8-27 09:50
buffer[16] 是串口的缓冲区,长度是16个字节
是一个循环缓冲区(circular buffer)
循环缓冲区或环形缓冲 ...

谢谢解释   又学习了一下
作者: a399288395    时间: 2023-8-27 10:25
wptr &= 0x0f 相当于 wptr = wptr & 0x0f ;
假设WPTR= 1010 1010  和0x0F相与 结果就是 0000 1010
就是把WPTR控制在0x0F之内,不会超出这个数据长度!
作者: sttt300    时间: 2023-8-28 08:52
可以改成if(wptr == 16) wptr=0;
这样是不是更好理解
作者: coody_sz    时间: 2023-8-28 11:09
将高4位清零,低4位保持不变。
作者: liucan2020    时间: 2023-8-28 16:12
wptr = wptr & 0x0f;把wptr 将高4位清零,低4位保持不变。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1