You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何读取温度计发送的8位单字节数据?代码错误排查与修正

问题:引脚电平转8位字节数据的代码报错解决

我正在将引脚的高低电平(1和0)转换为对应的8位数据,该引脚会接收另一设备发送的8位数据组成一个字节。我需要将这些1和0存入char或数组,再转换为数字或字符形式:检测到高脉冲时判定为1,无高脉冲则判定为0。

我尝试了以下代码:

char data = (0x00);
int valid = 0;
for(int i = 0; i <= 8; i++)
{
 //Add 1 or 0 to array
    while(pin==0)
    {
        delay(5,4);  // 60ns
        data << i = 0; // add 0 to char  
        valid = 1;
    }
    if(valid == 0)
    {
        data << i = 1;  //add 1 to char 
        delay(5,4); // wait for 50 seconds
    }
}

我本想通过二进制移位更新char的每一位,但代码报错,请问该如何解决?


解决方法

核心错误分析

  1. 移位赋值语法错误:data << i = 0 是非法写法,C语言中不能直接把移位结果赋值给位位置,必须用位掩码来设置/清除对应位。
  2. 循环次数错误:i <=8 会循环9次(0到8),但8位数据只需要处理8次,应改为i < 8。
  3. 逻辑混乱:while(pin==0) 会持续阻塞直到引脚变高,且每次循环都重复修改数据位;valid变量的逻辑无法正确区分0和1的采样场景。
  4. 延迟注释矛盾:代码中延迟参数和注释描述的时长不符,需要统一实际通信的时序需求。

修正后的代码示例

char data = 0x00;
// 处理8位数据,从第0位到第7位
for(int i = 0; i < 8; i++)
{
    // 等待电平稳定(根据实际通信时序调整延迟时长)
    delay(5,4); // 假设此延迟对应通信所需的采样间隔
    
    if(pin == 1) // 检测到高电平,设置当前位为1
    {
        data |= (1 << i); // 将第i位设置为1
    }
    else // 低电平,设置当前位为0(初始为0时可省略此步,仅作演示)
    {
        data &= ~(1 << i); // 将第i位设置为0
    }
    
    // 若通信需要间隔等待下一位数据,可在此添加对应延迟
    // delay(...);
}

关键说明

  • 位操作逻辑:
    • 设置第i位为1:data |= (1 << i) —— 把1左移i位后与data做按位或,保留其他位的同时将目标位设为1。
    • 设置第i位为0:data &= ~(1 << i) —— 把1左移i位后取反,再与data做按位与,保留其他位的同时将目标位设为0。
  • 时序处理:如果是同步通信(带时钟信号),需根据时钟触发采样;如果是异步通信,要确保延迟时间匹配发送端的脉冲宽度,避免误采样。
  • 引脚状态读取:确保pin是正确获取引脚电平的变量(比如Arduino中用digitalRead(pin)),直接用pin==0/1前要保证变量已更新为当前引脚状态。

内容的提问来源于stack exchange,提问作者ImadeAnewaccount

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 12:10:37