Introduzione
Utilizzando questo protocollo è possibile scambiare in modo sicuro dati tra un applicativo su Personal Computer e i controlli Robox via canale seriale. Si differenzia dalla comunicazione seriale in modo 0 (stringhe terminate) in quanto sia le domande che le risposte sono inglobate in un guscio e protette da CRC. Solo le direttive formalmente corrette (CRC valido) verranno eseguite.
NOTA: Non è possibile utilizzare le direttive di gestione flash (upload/download di files) utilizzando questo protocollo.
Abilitando questo protocollo su di un canale seriale, questo viene riservato esclusivamente al sistema, non è quindi possibile per l'utente utilizzare funzioni quali la ser_in(), ser_out().
Abilitazione protocollo
Per abilitare questo protocollo si deve utilizzare la seguente direttiva: PSER DLE_AscII.
Disabilitazione protocollo
Per disabilitare questo protocollo e riattivare quello AscII standard, si deve utilizzare la seguente direttiva: PSER AscII.
Per disabilitare questo protocollo e riattivare il protocollo BCC3 per la comunicazione con l'ambiente di sviluppo RDE, si deve utilizzare la seguente direttiva: PSER_DLE_BCC3.
Formato dei pacchetti
La trasmissione DLE-AscII non necessita dei prefissi di trasmissione :DrT:. Il comando trasmesso non deve essere terminato da LF (vedi comunicazione ascii in modo 0 - stringa terminata).
Il formato della trasmissione della domanda da PC a controllo Robox ha la seguente struttura:
Elem. |
Dim. (byte) |
Valore |
Significato |
---|---|---|---|
I |
1 |
0x10 (DLE) |
Carattere identificativo byte di comando |
II |
1 |
0x02 (STX) |
Codice di inizio buffer |
III |
1 |
0x21 |
Codice per protocollo (DLE-AscII) |
IV |
N Max 256 bytes |
…. |
Direttiva ascii terminata (stringa terminata da 0) Non servono i terminatori CR e/o LF. Eventuali caratteri 0x10 (DLE) DEVONO essere doppiati (nota nel calcolo del CRC se ne si considera solo uno) |
V |
1 |
0x10 (DLE) |
Carattere identificativo byte di comando |
VI |
1 |
0x03(ETX) |
Codice di fine buffer |
VII |
2 |
Crc16 |
Valore del CRC degli elementi: III. e IV. (elemento IV originale) |
Le domande sono assunte solo se viene riconosciuta la struttura e il CRC ricevuto corrisponde a quello calcolato. Se non c'è corrispondenza il comando viene ignorato.
Esempio
comando "D VE"
Il formato della trasmissione della risposta da controllo Robox a PC ha la seguente struttura :
NOTA: In caso di multi risposta, ogni singola risposta è incapsulata nella struttura DLE-STX ... DLE-ETX CRC. |
Calcolo del CRC16
Il calcolo del crc16 viene fatto con il polinomio 0x1021. Il valore iniziale del crc e 0xFFFF. (crc16_be)
Esempio
Qui di seguito riportiamo il software in C da utilizzarsi per calcolare il valore del CRC:
#define CRC16_POLINOMIAL 0x1021 // (x16+x12+x5+1) #define INITIAL_CRC 0xFFFF // valore iniziale di CRC typedef unsigned short U16 typedef unsigned char U8 U16 TableValues[256]; // routine di inizializzazione della tabella. void CreateTable (U16 nPolynomial) { int i, j, k; U16 nCRC; memset(TableValues,0, sizeof(U16) *256); // calcolare il valore di CRC per la posizione di indice n. for (i=0;i<256; i++) { k = i << 8; nCRC = 0; for (j=0; j<8; j++) { if ((nCRC ^ K) & 0x8000) nCRC = (U16) ( (nCRC <<1) ^nPolynomial); else nCRC <<=1; k <<= 1; } TableValues[i] = nCRC; } } // routine di calcolo del CRC. // vuole pointer a buffer. // numero di byte. // valore iniziale del CRC (o valore precedente se utilizzato in modo incrementale). // rende valore del CRC. U16 CalculateCRC16 (const void* pData, long nCount, U16 InitVal) { U8 *p = U8* (pData); U16 crc = InitVal; while (nCount--) crc = U16( (crc<<8) ^ TableValues[U8( (crc>>8)^*p++ )] ); return crc; } |