Benutzer mit den meisten Antworten
Wertwandlung richtig?

Frage
-
Hallo,
in meinem Projekt sende ich verschiedene Werte an mein USB Device.
Nun habe ich ein Array OUTBuffer, womit ich die Sachen sende. Da der Host nur Bytes verlangt, muß ich meine
Werte Wandeln. Im Beispiel ein NumericUpDown, womit ich einen Sollwert vorgebe. Dieser ist in den Einstellungen
beschränkt, das dieser nie höhere Werte als ein unsigned int hat.
Ist es so richtig?
OUTBuffer[0] = (unsigned char)(((unsigned int)TempRegSollwert->Value)& 0xFF ); // Lowbyte
OUTBuffer[1] = (unsigned char)(((unsigned int)TempRegSollwert->Value) >> 8); // Highbyte
Gruß Sascha
Antworten
-
Hallo SaschaFocus!
> in meinem Projekt sende ich verschiedene Werte an mein USB Device.
> Nun habe ich ein Array OUTBuffer, womit ich die Sachen sende. Da der
> Host nur Bytes verlangt, muß ich meine
Wenn er nur Bytes verlangt, dann solltest Du auch nur Bytes in dem
Buffer haben, oder?
Also Datentyp ist dann "unsigned char".
> Werte Wandeln. Im Beispiel ein NumericUpDown, womit ich einen Sollwert
> vorgebe. Dieser ist in den Einstellungen
> beschränkt, das dieser nie höhere Werte als ein unsigned int hat.
Wenn es bis "unsigned int" gehen soll, dann benötigst Du aber *4*
Bytes!!! und keine zwei...
> OUTBuffer[0] = (unsigned char)(((unsigned int)TempRegSollwert->Value)&
> 0xFF ); // Lowbyte
Das sieht schon mal gut aus, wobei das "& 0xFF" überflüssig ist, da es
ja durch das "(unsigned char)" eh auf dieses Byte beschränkt ist...
> OUTBuffer[1] = (unsigned char)(((unsigned int)TempRegSollwert->Value) >>
> 8); // Highbyte
Ja, passt doch...
Jochen Kalmbach (MVP VC++)- Als Antwort vorgeschlagen Robert Breitenhofer Montag, 22. Februar 2010 13:36
- Als Antwort markiert Robert Breitenhofer Mittwoch, 3. März 2010 09:40
Alle Antworten
-
Hallo SaschaFocus!
> in meinem Projekt sende ich verschiedene Werte an mein USB Device.
> Nun habe ich ein Array OUTBuffer, womit ich die Sachen sende. Da der
> Host nur Bytes verlangt, muß ich meine
Wenn er nur Bytes verlangt, dann solltest Du auch nur Bytes in dem
Buffer haben, oder?
Also Datentyp ist dann "unsigned char".
> Werte Wandeln. Im Beispiel ein NumericUpDown, womit ich einen Sollwert
> vorgebe. Dieser ist in den Einstellungen
> beschränkt, das dieser nie höhere Werte als ein unsigned int hat.
Wenn es bis "unsigned int" gehen soll, dann benötigst Du aber *4*
Bytes!!! und keine zwei...
> OUTBuffer[0] = (unsigned char)(((unsigned int)TempRegSollwert->Value)&
> 0xFF ); // Lowbyte
Das sieht schon mal gut aus, wobei das "& 0xFF" überflüssig ist, da es
ja durch das "(unsigned char)" eh auf dieses Byte beschränkt ist...
> OUTBuffer[1] = (unsigned char)(((unsigned int)TempRegSollwert->Value) >>
> 8); // Highbyte
Ja, passt doch...
Jochen Kalmbach (MVP VC++)- Als Antwort vorgeschlagen Robert Breitenhofer Montag, 22. Februar 2010 13:36
- Als Antwort markiert Robert Breitenhofer Mittwoch, 3. März 2010 09:40
-
Hallo,
>Wenn es bis "unsigned int" gehen soll, dann benötigst Du aber *4*
>Bytes!!! und keine zwei...
Oje, bin halt noch von den µC und C verklemmt, da dort ein unsigned int 16 Bits sind.
Aber wenn es sonst soweit passt, ist es gut. werde noch auf short ändern.
Gruß Sascha -
Hallo,
nun klappt es ja wunderbar, Daten an mein HID-Device zu schicken. Aber nun möchte ich ja auch Daten empfangen.
Wie kann ich den Value von einem NumericUpDown mit einem unsigned char beschreiben, was von meinem Device kommt?
So hängt die USB Kommunikation:
LbZeit1MinutenEin->Value=INBuffer[4];
Gruß Sascha -
Hallo SaschaFocus!
> Wie kann ich den Value von einem NumericUpDown mit einem unsigned char
> beschreiben, was von meinem Device kommt?
Ja, Du musst es halt wieder zurück wandeln...
> LbZeit1MinutenEin->Value=INBuffer[4];
Und was geht dran nicht?
Oder vielleicht so:
unsigned int i = ((unsigned int)InBuffer[0]) +
(((unsigned int)InBuffer[0]) << 8) +
(((unsigned int)InBuffer[0]) << 16) +
(((unsigned int)InBuffer[0]) << 24);
Jochen Kalmbach (MVP VC++) -
Hallo,
moment drücke ich einen Button, der das Bit KonfigLesen setzt:
if(KonfigLesen == TRUE) { OUTBuffer[0] = 0; //The first byte is the "Report ID" and does not get sent over the USB bus. Always set = 0. OUTBuffer[1] = 0xD0; for(unsigned char i = 2; i <65; i++) //This loop is not strictly necessary. Simply initializes unused bytes to OUTBuffer[i] = 0xFF; //0xFF for lower EMI and power consumption when driving the USB cable. if(WriteFile(WriteHandleToUSBDevice, &OUTBuffer, 65, &BytesWritten, 0)) //Blocking function, unless an "overlapped" structure is used INBuffer[0] = 0; if(ReadFile(ReadHandleToUSBDevice, &INBuffer, 65, &BytesRead, 0)) //Blocking function, unless an "overlapped" structure is used { if(INBuffer[1] == 0xD0) { LbZeit1Aktivieren->Checked=INBuffer[2]; } } KonfigLesen = FALSE; }
Hat der PC die Daten empfangen, löscht er das Bit. Lasse ich das
if(INBuffer[1] == 0xD0) { LbZeit1Aktivieren->Checked=INBuffer[2]; }
weg, läuft die Kommunikation weiter. Das sehe ich daran, da ich permanent einen Analogwert vom Device empfange. Lasse ich den Programmteil drin, hängt sich die Kommunikation weg.
Gruß Sascha -
> Kann es sein, da ja der USB Teil ein eigener Thread ist, ich von da aus
> nicht direkt die Variablen der Forms beschreiben kann?
Aus einem anderen Thread darfst Du nicht auf den UI-Thread oder
UI-Elemente zugreifen!
Verwende dazu "(control)->BeginInvoke"
Jochen Kalmbach (MVP VC++)