none
Wertwandlung richtig? RRS feed

  • 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
    Samstag, 20. Februar 2010 14:03

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++)
    Samstag, 20. Februar 2010 14:52

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++)
    Samstag, 20. Februar 2010 14:52
  • 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
    Samstag, 20. Februar 2010 15:06
  • 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
    Sonntag, 21. Februar 2010 14:07
  • 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++)
    Sonntag, 21. Februar 2010 14:29
  • 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
    Sonntag, 21. Februar 2010 14:37
  • Und wo ist jetzt Deine Frage?

    PS: Ich würde vermuten, dass das & bei ReadFile/WriteFile vor dem
    Parameter OutBuffer/INBuffer zu viel ist...

    Jochen Kalmbach (MVP VC++)
    Sonntag, 21. Februar 2010 14:42
  • Kann es sein, da ja der USB Teil ein eigener Thread ist, ich von da aus nicht direkt die Variablen der Forms beschreiben kann?
    Sonntag, 21. Februar 2010 14:44
  • > 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++)
    Sonntag, 21. Februar 2010 14:51