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.