如何读取温度计发送的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的每一位,但代码报错,请问该如何解决?
解决方法
核心错误分析
- 移位赋值语法错误:
data << i = 0是非法写法,C语言中不能直接把移位结果赋值给位位置,必须用位掩码来设置/清除对应位。 - 循环次数错误:
i <=8会循环9次(0到8),但8位数据只需要处理8次,应改为i < 8。 - 逻辑混乱:
while(pin==0)会持续阻塞直到引脚变高,且每次循环都重复修改数据位;valid变量的逻辑无法正确区分0和1的采样场景。 - 延迟注释矛盾:代码中延迟参数和注释描述的时长不符,需要统一实际通信的时序需求。
修正后的代码示例
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。
- 设置第i位为1:
- 时序处理:如果是同步通信(带时钟信号),需根据时钟触发采样;如果是异步通信,要确保延迟时间匹配发送端的脉冲宽度,避免误采样。
- 引脚状态读取:确保
pin是正确获取引脚电平的变量(比如Arduino中用digitalRead(pin)),直接用pin==0/1前要保证变量已更新为当前引脚状态。
内容的提问来源于stack exchange,提问作者ImadeAnewaccount
相关产品推荐
相关产品推荐

