CINT在.NET MF中无法正常工作
-
26-10-2019 - |
题
我有一些非常点头的东西可以跨越RGB LED的颜色,并且我有问题获得所需的值。
我将这个示例删除至最低限度,但是 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微框架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
在Windows 7 64位上的.NET 4.0(非微型)上,我没有看到您看到的Cint/Cuint(矿山正确转换)。这可能是NetDuino/Micro Framework中的实现错误...如果我拥有它,我将为您测试。
其他提示
无论发生什么事情,我都建议您尽可能多地避免使用UINT(我去过那里)。我会这样写代码:
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))
我还没有弄清楚任何边缘案例,但这在我尝试过的几个示例中都可以使用。如果必须在循环中进行操作,我不建议您这样做,因为它的性能不佳,但是在您找到更好的东西之前,它可能是一个定格隙。