Вопрос

У меня есть что-то довольно привлекательное, чтобы пересечь цвет светодиода RGB, и у меня возникают проблемы с получением желаемых значений.

Я снял этот пример до минимума, но Start, End а также Steps все будет переменным ...

Этот должен линейно приращение R (Uint) от 0 до 255 в 100 шагов. Я не слишком беспокоюсь о точности, поэтому мне не волнует, если она правильно обвотрится или просто делает Floor/Ceiling

    Dim Start As UInteger = 0
    Dim [End] As UInteger = 255
    Dim Steps = 100

    For x = 1 To Steps
        Dim Temp = ([End] - Start) / Steps * x + Start
        Dim R = CUInt(Temp)

        Debug.Print(x.ToString & ": Temp: " & Temp.ToString & ", R:" & R.ToString)
        LedR.SetPulse(255, R)
        Threading.Thread.Sleep(20)
    Next

Это выводит:

1: Temp: 2.5500, R:196608
2: Temp: 5.1000, R:327680
3: Temp: 7.6500, R:524288
4: Temp: 10.2000, R:655360
5: Temp: 12.7499, R:851968
...
95: Temp: 242.2488, R:15859712
96: Temp: 244.7988, R:16056320
97: Temp: 247.3488, R:16187392
98: Temp: 249.8988, R:16384000
99: Temp: 252.4488, R:16515072
100: Temp: 254.9988, R:16711680

Как вы можете видеть, временная переменная довольно верна, что позволяет получить небольшую неточную ошибку, но я не вижу, что такое корреляция с R.

Возможно, что Cuint просто читает биты для температуры и лечит Double как UInt - Но если да, то как мне заставить его правильно преобразовать?

(Между прочим, это работает на NetDuino), .NET Micro Framework 4.2

Изменить: тесты, запрошенные ниже:

    Dim Test As Integer = 2
    Debug.Print(Test.ToString)
    Debug.Print(CInt(Test).ToString)
    Debug.Print(CUInt(Test).ToString)

    2
    2
    2

    Dim Test As Double = 2.5
    Debug.Print(Test.ToString)
    Debug.Print(CInt(Test).ToString)
    Debug.Print(CUInt(Test).ToString)

    2.5000
    131072
    131072

Используя следующий код ...

    For x = 0 To Steps
        Dim Temp As Long = ([End] - Start) \ Steps * x + Start
        Dim R = CType(Temp, UInteger)

        Debug.Print(x.ToString & ": Temp: " & Temp.ToString & ", R:" & R.ToString)
        LedR.SetPulse(255, R)
        Threading.Thread.Sleep(20)
    Next

Я получаю (на Dim Temp линия):

An unhandled exception of type 'System.Exception' occurred in Netduino_VBTest.exe

Нет внутреннего исключения, но чуть выше него в результате вывода является исключением первого шанса, который, как я полагаю, является основной причиной:

A first chance exception of type 'System.NotImplementedException' occurred in Microsoft.SPOT.Native.dll
Это было полезно?

Решение

Попробуйте использовать Convert.touint32, изложено здесь: http://msdn.microsoft.com/en-us/library/y3569ft9.aspx

На моем .NET 4.0 (не микро) в Windows 7 64Bit я не вижу того, что вы видите с Cint/Cuint (шахта преобразуется правильно). Это может быть ошибка реализации в NetDuino/Micro Framework ... если бы у меня была ее, я бы проверил вышеупомянутое для вас.

Другие советы

Что бы ни происходило, я бы посоветовал вам избегать подливок как можно больше (я был там). Я бы написал код так:

Dim Start As Integer = 0
Dim [End] As Integer = 255
Dim Steps As Integer = 100

For x As Integer = 1 To Steps
    Dim Temp As Integer = ([End] - Start) \ Steps * x + Start
    LedR.SetPulse(255, CType(Temp,UInteger))
    Threading.Thread.Sleep(20)
Next

Я не могу попробовать это, потому что у меня нет компилятора vb.net, и я написал код непосредственно, поэтому простите меня, если есть какие -либо ошибки компиляции.

Другой подход совершенно другой. Поскольку проблема выглядит с удвоением и конверсиями, мы могли бы избежать удвоений, делая только вычитание:

Dim Start As Integer = 0
Dim [End] As Integer = 255
Dim Increment As Integer = 3
Dim Current as Integer = Start

While Current < End
    Current = Current + Increment
    LedR.SetPulse(255, CType(Current ,UInteger))
    Threading.Thread.Sleep(20)
End While

Быстро и грязно, но это работает.

Как насчет

Debug.Print(Test.ToString().Split("."c)(0))

Я не выработал никаких краев, но это работало над несколькими примерами, которые я попробовал. Я бы не порекомендовал это решение, если оно должно быть выполнено в петле, так как оно не будет работать хорошо, но это может быть стоп-заглушка, пока вы не найдете что-то лучше.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top