Så kan ett protokoll se ut:
Header:
Byte 1: 0x55; protokollidentifierare
Byte 2: 0x00; alltid 0x00
Byte3-4: Paketlängd exklusive header och CRC
Payload:
BYte 5: Kommando
Byte 5+1 - 5+xx: Data
CRC:
Byte xx+1 - Byte xx+2 16 Bit CRC
Databyten behöver inte alltid finnas, beroende på vilket kommando man skickar.
Har man fast längd på Payloaden kan man skippa paketlängden
När det gäller kod så kör man naturligtvis allt med interrupt, både att skicka och ta emot.
Man har dessutom en time-out så att man kan detektera avbrott i kommunikationen, dvs har det inte kommit data inom x antal ms så skippar man det hela och startar om.
Man kan även specificera längsta mellanrum mellan två bytes i datagrammet, och även minsta tiden mellan två datagram.
Om man har flera mottagare på linan, som till exempel vid RS485, kan man lägga till adressbytes i början.
Vissa processorer har adressavkodning i hårdvaran, vilken då ofta initieras med att adressbiten är satt på första byten (i de lägena använder man sig av 9-bitars kommunikation i stället för 8-bitars)
Delar av en mottagningsrutin kan till exempel se ut så här:
Kod: Markera allt
if(mU1RXGetIntFlag() )
{
INTEnable(INT_U1TX, INT_DISABLED);
AQL_bus_TX_disable();
while(UARTReceivedDataIsAvailable(RS485_AQL_UART_PORT) )
{
if ( U1STA & AQLB_COM_ERRORS ) {
break;
}
AQLB_Rx_Pointer_u16++;
if(AQLB_Rx_Pointer_u16 >= AQLB_RX_MAXBUFFER)
{
AQLB_Rx_Pointer_u16 = 0;
AQL_bus_RX_data.error = AQLB_ERR_BUFFER_FULL;
global_data.W_Bus_stat.BUFFO_u32++;
break;
}
AQLB_Rx_data_u16 = U1RXREG; //ReadUART1();
Skall man skicka, så gör man på ett snarlikt sätt