Buenas tardes Pablo.
La duda es sobre los parámetros del protocolo CSP. Supongamos que yo tengo que enviar 10 bytes de payload, cuáles son los valores correctos para los bytes "CMDIN_ARGSIZEx" del array?.
Para 10 bytes te quedaría algo así el array a transmitir:
// Configurar CSP Header
Data[CMDIN_PASS_OFFSET] = 0
Data[CMDIN_PASS_OFFSET+1] = 0
Data[CMDIN_PASS_OFFSET+2] = 0
Data[CMDIN_PASS_OFFSET+3] = 0
Data[CMDIN_PROTO_OFFSET] = CMDSERV_PROTO_VERSION
Data[CMDIN_TYPE_OFFSET] = CMD_TYPE_QUIET
Data[CMDIN_ARGSIZE0_OFFSET] = 1+10 // Datos a transmitir + 1
Data[CMDIN_ARGSIZE1_OFFSET] = 0
Data[CMDIN_ID_OFFSET] = PBCMD_UdpRx
Data[CMDIN_ARGS_OFFSET] = 10 // Cmd UdpRx Arg. Size (10 bytes)
// Set data values (valores a transmitir).
Data[CMDIN_ARGS_OFFSET+1] = 1
Data[CMDIN_ARGS_OFFSET+2] = 2
Data[CMDIN_ARGS_OFFSET+3] = 3
Data[CMDIN_ARGS_OFFSET+4] = 4
Data[CMDIN_ARGS_OFFSET+5] = 5
Data[CMDIN_ARGS_OFFSET+6] = 6
Data[CMDIN_ARGS_OFFSET+7] = 7
Data[CMDIN_ARGS_OFFSET+8] = 8
Data[CMDIN_ARGS_OFFSET+9] = 9
Data[CMDIN_ARGS_OFFSET+10] = 10
Offset Parameters Value
06 CMDIN_ARGSIZE0 03 -- Aquí tengo que poner 03, o tengo que poner 0B
07 CMDIN_ARGSIZE1 00 -- Este siempre lo dejo en cero
09 CMDIN_ARGS 0A -- Aquí le pongo siempre 0A porque envío 10 bytes de payload.
En realidad no entiendo el significado de los parámetros CMDIN_ARGSIZE0 y CMDIN_ARGSIZE1, puesto que en realidad el tamaño de la payload ya va en CMDIN_ARGS. Es como que tienen la misma función.
El campo
CMDIN_ARGSIZE0 y
CMDIN_ARGSIZE1, dan el valor total de bytes a transmitir del comando. Pero en este caso, el subcomando "
PBCMD_UdpRx" requiere que se le diga cuantos bytes de información esta recibiendo en
CMDIN_ARGS.
Entonces, si transmitís 10 bytes de datos útiles, 1 byte debés utilizarlo para indicar su longitud en
CMDIN_ARGS.
Por lo tanto:
CMDIN_ARGSIZE0 =
CMDIN_ARGS + 1
Te consulto una duda que me surgió con relación a la recepción de paquetes UDP, que en algunos momentos me anda medio errático (hay paquetes que llegan, y otros que no llegan).
UDP no es un protocolo confiable, más si la transmisión esta en redes lejanas o con trafico.
Pero, a veces me a resultado que luego de energizarse la placa, algunos paquetes iniciales UDP se pierden, pero luego funciona correctamente.
Esto lo solucioné enviando previamente un paquete vacio (NULL) o sin función alguna, que actualiza tablas ARP y conectividad en algunos sistemas.
Por ejemplo:
// Configurar CSP Header
Data[CMDIN_PASS_OFFSET] = 0
Data[CMDIN_PASS_OFFSET+1] = 0
Data[CMDIN_PASS_OFFSET+2] = 0
Data[CMDIN_PASS_OFFSET+3] = 0
Data[CMDIN_PROTO_OFFSET] = CMDSERV_PROTO_VERSION
Data[CMDIN_TYPE_OFFSET] = CMD_TYPE_QUIET
Data[CMDIN_ARGSIZE0_OFFSET] = 0
Data[CMDIN_ARGSIZE1_OFFSET] = 0
Data[CMDIN_ID_OFFSET] = 0
Podes enviarlo antes de cada transmisión (algunas veces o esperar luego del mismo) y luego transmitir los datos útiles.
Saludos!