Cint funktioniert nicht wie erwartet in .NET MF
-
26-10-2019 - |
Frage
Ich habe etwas ziemlich nickend, um die Farbe einer RGB-LED zu fördern, und ich habe Probleme, die gewünschten Werte zu erhalten.
Ich habe dieses Beispiel aber auf ein Minimum beruht, aber Start
, End
und Steps
wird alle variabel sein ...
Dies sollte linear inkrementiert R
(Uint) von 0 bis 255 in 100 Schritten. Ich mache mir hier keine Sorge um Präzision, daher ist es mir egal, ob es richtig rundet oder einfach eine macht 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
Dies gibt aus:
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
Wie Sie sehen können, ist die TEMP-Variable ziemlich richtig richtig, was eine leichte Ungenauigkeit ermöglicht, aber ich kann nicht sehen, mit welcher Korrelation der Fall ist R
.
Es ist möglich, dass Cuint einfach die Temps für Temperatur liest und die behandelt Double
Als ein UInt
- Aber wenn ja, wie kann ich es dazu bringen, es richtig zu konvertieren?
(Übrigens läuft dies auf einem Netduino), .NET Micro Framework 4.2
Bearbeiten: Nachfolgend angeforderte Tests:
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
Verwenden Sie den folgenden Code ...
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
Ich bekomme (auf der Dim Temp
Linie):
An unhandled exception of type 'System.Exception' occurred in Netduino_VBTest.exe
Es gibt keine innere Ausnahme, aber in der Ausgabe ist es eine Ausnahme der ersten Chance, die ich vermute, die Hauptursache ist:
A first chance exception of type 'System.NotImplementedException' occurred in Microsoft.SPOT.Native.dll
Lösung
Versuchen Sie es mit Convert.touint32, hier beschrieben: http://msdn.microsoft.com/en-us/library/y3569ft9.aspx
Auf meinem .NET 4.0 (nicht Micro) unter Windows 7 64bit sehe ich nicht, was Sie mit Cint/Cuint sehen (meine konvertiert richtig). Dies kann ein Implementierungsfehler in Netduino/dem Micro -Framework sein ... wenn ich es hätte, würde ich das oben auf Sie testen.
Andere Tipps
Was auch immer passiert, ich würde Ihnen raten, Uints so viel wie möglich zu vermeiden (ich war dort). Ich würde den Code so schreiben:
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
Ich kann es nicht versuchen, weil ich nicht den VB.NET -Compiler zur Verfügung habe und den Code direkt geschrieben habe. Bitte verzeihen Sie mir, wenn es Kompilierungsfehler gibt.
Ein anderer Ansatz völlig anders. Da das Problem mit Doppel und Konvertierungen zu sein scheint, könnten wir es vermeiden, dass Doppel nur Subtrahiere durchführen:
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
Schnell und schmutzig, aber es funktioniert.
Wie wäre es mit
Debug.Print(Test.ToString().Split("."c)(0))
Ich habe keine Kantenwagen ausgearbeitet, aber dies hat an ein paar Beispielen gearbeitet, die ich ausprobiert habe. Ich würde diese Lösung nicht empfehlen, wenn dies in einer Schleife durchgeführt werden muss, da sie nicht gut funktioniert, aber es könnte ein Stopplücken sein, bis Sie etwas Besseres finden können.