3

我有一些非常点头的东西可以交叉淡化 RGB LED 的颜色,但我在获得所需值时遇到了问题。

我已经将这个例子精简到最低限度,但是StartEnd并且Steps都将是可变的......

应该以 100 步线性递增R(UInt) 从 0 到 255。我不太担心这里的精度,所以我真的不在乎它是否正确舍入或只是做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

如您所见, Temp 变量非常正确,允许有一些不精确,但我看不出与R.

CUint 可能只是读取 Temp 的位并将其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
4

4 回答 4

2

尝试使用此处概述的 Convert.ToUInt32:http: //msdn.microsoft.com/en-us/library/y3569ft9.aspx

在 Windows 7 64 位上的 .Net 4.0(不是 Micro)上,我没有看到您使用 CInt/CUInt 看到的内容(我的转换正确)。这可能是 netduino/微框架中的一个实现错误......如果我有它,我会为你测试上面的内容。

于 2012-01-10T15:41:47.120 回答
1

无论发生什么,我都建议您尽可能避免使用 UInts(我去过那里)。我会这样写代码:

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 编译器,并且我直接在 SO 上编写了代码,如果有任何编译错误,请原谅我。

于 2012-01-10T14:58:37.367 回答
1

另一种方法完全不同。由于问题看起来与双打和转换有关,我们可以避免双打只做减法:

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

又快又脏,但它有效。

于 2012-01-10T16:29:01.167 回答
1

怎么样

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

我还没有解决任何极端情况,但这适用于我尝试的几个示例。如果必须在循环中执行此解决方案,我不会推荐此解决方案,因为它不会表现良好,但这可能是一个权宜之计,直到您找到更好的东西。

于 2012-01-10T16:29:29.810 回答