1

我喜欢在 Windows 10 IoT 上使用 C# 在 Raspberry Pi 上解码 X10 代码,但我没有使用 RF 解码的经验,所以这对我来说是新领域。

我遇到了这篇文章,并尝试将其转换为 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;
                            }
                        }
                    };
                }
            });
        }
4

1 回答 1

0

这是我当前使用的代码,但是没有调用 ValueChanged 事件。

此问题由 using 语句引起,即 C#“使用”语句导致调用 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);

                    ...
                    ...
于 2017-02-13T06:56:27.723 回答