Buon pomeriggio, 
mi ritrovo con un problema di apparente semplice soluzione ma a cui, al momento, non riesco a venire a capo.
Ho da settare 2 parametri sul mio Arduino DUE dei pin PWM. I parametri sono frequenza (nel range 100-500) ed ampiezza (nel range 0-200).
Lato Arduino faccio il seguente comando per la lettura dei parametri da seriale: 
	unsigned int a; // packet read
	unsigned int freq,ampl;
	int duty_cycle;
 
	unsigned char RXBuf[3];   
     
    Serial.readBytes(RXBuf,3);
        
        if(RXBuf[0]==HDR_BYTE){
//       
          a = RXBuf[1]+256*RXBuf[2];
//
          freq = (a & 0xFF00)>>8;  //Freq
          freq = int(freq)*2;   
          ampl = (a & 0x00FF); //ampl
          
          //successivamente ho i comandi per il settaggio dei PWM e dovrebbero essere corretti 
Praticamente Arduino ascolta la seriale: quando sente un carattere di inizio (HDR_BYTE) voglio che prenda i successivi byte e mi ritorni al valore iniziale di freq e ampiezza passati da C.
Lato C immagino dovrei fare la medesima cosa ma al contrario di quella che faccio in Arduino ma non funziona:
void HapticTable::Set_Vibration(int freq, int ampl) {
	unsigned char TXBuf[3];
	
	freq = UINT8(freq/2);
	ampl = UINT8(ampl);
	TXBuf[0] = HDR_BYTE;
	TXBuf[1] = (freq & 0x00FF << 8);
	TXBuf[2] = (ampl & 0xFF00);
	// a = UINT16((freq*(2 ^ 8)) + ampl); //no
	arduino.writeSerialPort(TXBuf, 3); //scrive su seriale-> HDR_byte[freq][ampl]  
}
//Funzione di scrittura su seriale
bool SerialPort::writeSerialPort(unsigned char *buffer, unsigned int buf_size)
{
	DWORD bytesSend;
	if (!WriteFile(this->handler, (void*)buffer, buf_size, &bytesSend, 0)) {
		ClearCommError(this->handler, &this->errors, &this->status);
		return false;
	}
	else return true;
}	
	
Immagino io sbagli qualcosa nella conversione. Ho provato molte altre cose ma tutte non sono andate a buon fine.
writeSerialPort riceve *char. ReadBytes riceve unsigned char.
Grazie a chiunque mi voglia e possa aiutare.