Abilitare JavaScript per vedere questo sito.

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.

dle_ascii

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"

Bytes

Significato

0x10

DLE

0x02

STX

0x21

Codice protocollo

0x44

'D'

0x20

Spazio

0x56

'V'

0x45

'E'

0x0

Terminatore di stringa

0x10

DLE

0x03

ETX

0x..

CRC low byte

0x..

CRC high byte

Il formato della trasmissione della risposta da controllo Robox a PC 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

….

risposta (se ascii terminata da 0)

Eventuali caratteri 0x10 (DLE) SONO 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)

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;

}

 

  

Keyboard Navigation

F7 for caret browsing
Hold ALT and press letter

This Info: ALT+q
Page Header: ALT+h
Topic Header: ALT+t
Topic Body: ALT+b
Contents: ALT+c
Search: ALT+s
Exit Menu/Up: ESC