我喜欢在Windows 10 IoT上使用C#在Raspberry Pi上解码X10 Code,但我没有使用RF解码的经验,所以这对我来说是个新领域。
我遇到了this帖子,我试图将其转换为C#代码,但我没有成功。有没有人知道如何使用C#正确解码这个X10代码,或者有人能指出我正确的协议规范。
以下是我目前使用的代码,但未调用ValueChanged
事件。
public static void Sniff(uint gpioPinNumb)
{
Task.Run(() => {
using (GpioPin pin = GpioController.GetDefault().OpenPin((int)gpioPinNumb, GpioSharingMode.Exclusive))
{
pin.SetDriveMode(GpioPinDriveMode.Input);
Stopwatch sw = Stopwatch.StartNew();
long elapsedMicrons = 0;
int[] states = new int[67];
int[] durations = new int[67];
uint changeCount = 0;
bool lockPassed = false;
bool isLock = false;
pin.ValueChanged += (GpioPin sender, GpioPinValueChangedEventArgs args) =>
{
elapsedMicrons = sw.ElapsedTicks / 10;
sw.Restart();
//Debug.WriteLine(elapsedMicrons);
if (elapsedMicrons > 25000 && !lockPassed && !isLock)
{
//X10 lock started
changeCount = 0;
durations[changeCount++] = (int)elapsedMicrons;
isLock = true;
Debug.WriteLine("Lock Started");
Debug.WriteLine("");
}
else if (isLock)
{
if (changeCount >= durations.Length)
{
isLock = false;
changeCount = 0;
Debug.WriteLine("===============================");
for (int i = 0; i < durations.Length; i++)
{
Debug.Write(durations[i++]);
Debug.Write(" ");
}
Debug.WriteLine("");
}
else
{
durations[changeCount++] = (int)elapsedMicrons;
}
}
};
}
});
}
答案 0 :(得分:0)
这是我目前使用的代码,但是ValueChanged事件 不被称为。
这个问题是由于使用C#&#34;使用&#34;语句导致调用Dispose()。这与Close()相同。一旦调用Dispose,它还会导致对象本身超出范围。
为了安全起见,您可以pin
移出Sniff
方法,如下所示:
private static GpioPin pin;
public static void Sniff(uint gpioPinNumb)
{
Task.Run(() => {
pin = GpioController.GetDefault().OpenPin((int)gpioPinNumb, GpioSharingMode.Exclusive);
pin.SetDriveMode(GpioPinDriveMode.Input);
...
...