【问题标题】:Read bits and put them into integer [C]读取位并将它们放入整数 [C]
【发布时间】:2018-05-21 09:10:41
【问题描述】:

我真的是 C 的新手,我在位操作方面遇到了麻烦,我阅读了很多关于它的信息,似乎它是 C 的困难部分之一,有人可以解释我如何收集 32 位然后将它们分配给无符号整数。

    unsigned int collect_bits;     // define var
    for (int i = 0;i < 31; i++)    // loop for 32bits
    {
    collect_bits &= HAL_GPIO_ReadPin (GPIOC,GPIO_PIN_9);  //read PORTC current bit and assign it to collect_bits    
    }

我知道上面的代码是错误的,但我不知道如何将位从 PORT 分配给 var

【问题讨论】:

  • 你真的想读同一个密码 32 次吗?
  • @PeterJ_01 好吧,我只是开始使用 C 和 Keil,我没有找到任何可以从端口读取超过 1bit 的 HAL 函数
  • 但我想你应该明白这个简单的问题:你想一直读**相同的位还是你想读不同的?**
  • @PeterJ_01 我试图用我的 MCU 从另一个设备捕获数据,所以我尝试先在 clk PIN 上捕获高时钟脉冲,然后才读取数据引脚(C9),因此它不会是同一个引脚。所以,是的,我想阅读不同的位
  • 你能用更技术的方式解释一下吗? (阅读:更准确)顺便说一句,我看到它是 STM uC - 为什么你想要 bitbang 而不是使用硬件外围设备。当您问这个问题时,确切地写出您想要存档的内容、uC 的型号以及您想要从/向/向其读取/写入数据的设备的型号

标签: c bit-manipulation bit


【解决方案1】:

您的代码存在 3 个问题:

  • 你没有初始化collect_bits
  • 您的循环仅读取 31 位
  • 您使用按位 AND(又名 &),而您应该使用按位 OR(又名 |)

所以假设HAL_GPIO_ReadPin 返回01,你可以这样做:

unsigned int collect_bits = 0;
for (int i = 0; i < 32; i++)
{
    unsigned int current_bit = HAL_GPIO_ReadPin (GPIOC,GPIO_PIN_9);
    collect_bits |=  current_bit << i;  // Shift current_bit to position i and
                                        // put it into collect_bits using bit wise OR
}

现在从引脚读取的第一个位在collect_bits 的位0,从引脚读取的第二个位在collect_bits 的位1,依此类推。

顺便说一句:您必须确保 unsigned int 在您的系统上是 32 位

【讨论】:

  • 所以它与 collect_bits |= HAL_GPIO_ReadPin (GPIOC,GPIO_PIN_9); ??
  • @kooda 我是这样写的(使用额外的变量)以使其更清晰,因为您没有发布HAL_GPIO_ReadPin 的原型。不过不用担心,编译器会为你优化代码以避免额外的局部变量。
  • 谢谢,还有一个问题,你为什么要在循环中重新初始化unsigned int current_bit
  • @kooda 1) 不确定您的意思是 reinitialize。我正在从引脚读取下一位。我在循环内定义了变量以限制范围,即它在循环外不存在。 2) 是的,使用uint32_t 是明智的
  • @kooda 他没有重新初始化它。
【解决方案2】:

collect_bits 未初始化,

试试这个

unsigned int collect_bits = 0;     // define var
for (int i = 0;i < 31; i++)    // loop for 32bits
{
    collect_bits |= HAL_GPIO_ReadPin (GPIOC,GPIO_PIN_9);  //read PORTC status  and assign it to collect_bits    
}

【讨论】:

    猜你喜欢
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-08
    • 1970-01-01
    • 2018-12-14
    相关资源
    最近更新 更多