Buongiorno,
ho un elicottero da modellismo (un quadrirotore) che permette di essere controllato via pc inviando dei dati su porta seriale, utilizzando un protocollo dati di 18 bytes, l'elicottero è il seguente :
www.asctec.de/downloads/researchpilot_manual.pdf
Il dato da mandargli è il seguente:
1)startstring 1: > (0x3e in hex)
2)startstring 2: * ( 0x2A)
3)startstring 3: > (0x3e in hex)
4)packet descripotr -> always 0x17
5)length of packet - lowbyte
6)length of packet - highbyte
7)pitch - low byte
8)pitch - high byte
9)roll -low byte
10)roll - high byte
11)thrust - low byte
12)thrust - high byte
13)yaw - low byte
14)yaw - high byte
15)flags -low byte --->> every single bit of this one enable the communication between serial port and a parts of my copter (epecially, an 1 in 8th position enable comm via serial interface, the 1 in 3rd position enable thrust control through serial interface , in binary is 1000 0100 (0x84 in hex)
16)flags - high byte --> sendrate of packet, values from 5 to 255 admitted
17)crc16 - high byte
18)crc16- low byte
Ho realizzato un programma console con Visual C++ Express 2010 (il SO è Vista) che è in grado di inviare correttamente questi 18 caratteri, tant'è è che nella risposta dell'elicottero, fra i vari bytes, ce n'è uno di packet descriptor che vale 0x19, così come indicato dover essere dalla mia guida.
I metodi di r/w che utilizzo sono quelli della classe serialPort (tipo serialPort->Write(buffer,int, int) per intenderci).
Il problema è che non ho una risposta (accensione motori) dall'elicottero, anche se credo di aver fissato correttamente i parametri per attivare i motori (ad esempio, se al byte chiamato flags_low invio 0x84, in binario vale 1000 0100, di cui il primo 1 abilita la comunicazione seriale e il secondo abilita i motori via seriale).
Col modellino mi hanno fornito un test software che invece funziona, riesce ad accendere i motori e ad incrementarne la spinta.
quello che ho fatto quindi è di analizzare il flusso dati della porta serial, utilizzando Hdd Serial Monitor, sia di questo test software che del mio programma.
Una vistosa differenza fra i due programmi è che io invio sempre e solo 18 bytes, che sono sempre gli stessi, mentre il test software a volte sembra inviare più di 18 bytes prima di scatenare la ricezione, e soprattutto i dati della stringa inviata ogni tanto cambiano, senza che io debba intervenire cliccando qualche bottone dell'interfaccia grafica.
La ricezione dei dati dall'elicottero al pc utilizzando il test software è anche diversa, a volte ricevo più dati, a volte meno. Insomma, questo testsoftware riceve ed invia dati in numero che a me pare randomico, mentre io nel mio programma fisso il numero di dati da ricevere utilizzando un ciclo for che si ferma ad un numero fisso, tipicamente 16 byte in scrittura e 52 byte in ricezione, come scritto nella mia guida.
testsoftware that works
http://www.megaupload.com/?d=2SZ4Z4HQ
my code, not working
http://www.megaupload.com/?d=K8R9IIHX
Penso che uno dei problemi del mio programma siano nelle rigidità che introduco, forse dovrei pensare a qualcosa come un ring buffer, almeno in ricezione dati (per la scrittura invece, non saprei proprio come fare, la guida mi parla solo di inviare i 18 byte).
...Ma poi la ricezione dei dati dall'elicottero sarà proprio necessaria per poter accendere i motori?
E' il momento per me di tornare ad una buona teoria, spero che possiate indicarmi dove iniziare a guardare.
Buon Sabato!
Marco.
ecco le parti salienti del mio programma