C# .NET 5 树莓派对接Break beam传感器无相关输出问题求解
问题排查与解决步骤
1. 核心代码逻辑修正
你当前代码的最大错误是把连接Break Beam传感器的GPIO引脚配置为了输出模式,Break beam属于输入型传感器,必须配置为输入模式才能读取传感器的电平变化。且现有代码逻辑是循环向引脚写入高低电平,完全没有读取传感器状态的相关逻辑,自然不会产生光束阻断的相关输出。
修正后的基础参考代码:
using System; using System.Device.Gpio; using System.Threading; Console.WriteLine("Break Beam 计数启动,按Ctrl+C结束"); const int BeamPin = 17; int objectCount = 0; // 初始化GPIO控制器 using GpioController controller = new GpioController(); // 配置引脚为输入模式,根据传感器类型选择上拉/下拉,多数对射传感器默认高电平、阻断时变低,这里使用InputPullUp controller.OpenPin(BeamPin, PinMode.InputPullUp); // 记录上一次引脚状态,避免传感器抖动导致重复计数 PinValue lastState = controller.Read(BeamPin); try { while (true) { PinValue currentState = controller.Read(BeamPin); // 检测到状态变化:从高变低说明光束被阻断 if (currentState != lastState) { if (currentState == PinValue.Low) { objectCount++; Console.WriteLine($"光束被阻断,当前计数:{objectCount}"); } lastState = currentState; // 消抖逻辑,时长可根据实际运行效果调整 Thread.Sleep(50); } // 降低CPU占用 Thread.Sleep(10); } } finally { controller.ClosePin(BeamPin); Console.WriteLine($"程序结束,总计数:{objectCount}"); }
2. 硬件连接排查
- 确认Break beam传感器的供电引脚接对树莓派的3.3V/5V(匹配传感器额定电压),GND需和树莓派共地
- 确认传感器的信号输出引脚确实接至树莓派BCM编码的17号引脚,请勿混淆BCM编码和BOARD编码
- 用万用表直接测量传感器信号引脚的电平:正常无遮挡时为高电平,遮挡时切换为低电平,先确认传感器本身功能正常
3. 运行环境排查
- 确认安装的.NET版本为.NET 6及以上,且已经正确引入
System.Device.GpioNuget包 - Linux下运行程序需要root权限,需使用
sudo dotnet run命令启动,否则无权限操作GPIO引脚 - 若仍无相关输出,可在循环逻辑中新增调试打印,每次读取引脚电平后直接输出,确认程序能正常捕获电平变化
内容的提问来源于stack exchange,提问作者William Sewell
相关产品推荐
相关产品推荐

