Analizar y leer el marco de datos en C?

Estoy escribiendo un programa que lee los datos del puerto serie en Linux. Los datos son enviados por otro dispositivo con el siguiente formato de trama:

|start | Command | Data               | CRC  | End |
|0x02  | 0x41    | (0-127 octets)     |      | 0x03|
----------------------------------------------------

El campo de datos contiene 127 octetos como se muestra y el octeto 1,2 contiene un tipo de datos; El octeto 3,4 contiene otros datos. Necesito obtener estos datos

Sé cómo escribir y leer datos hacia y desde un puerto serie en Linux, pero es solo para escribir y leer una cadena simple (como "ABD")

Mi problema es que no sé cómo analizar el marco de datos con el formato anterior para poder:

obtener los datos en el octeto 1,2 en el campo Datosobtener los datos en el octeto 3,4 en el campo Datosobtenga el valor en el campo CRC para verificar la consistencia de los datos

Aquí el código de recorte de muestra que lee y escribe una cadena simple desde y hacia un puerto serie en Linux:

int writeport(int fd, char *chars) {
    int len = strlen(chars);
    chars[len] = 0x0d; // stick a <CR> after the command
    chars[len+1] = 0x00; // terminate the string properly
    int n = write(fd, chars, strlen(chars));
    if (n < 0) {
        fputs("write failed!\n", stderr);
        return 0;
    }
    return 1;                                                                                                           
}

int readport(int fd, char *result) {
    int iIn = read(fd, result, 254);
    result[iIn-1] = 0x00;
    if (iIn < 0) {
        if (errno == EAGAIN) {
            printf("SERIAL EAGAIN ERROR\n");
            return 0;
        } else {
            printf("SERIAL read error %d %s\n", errno, strerror(errno));
            return 0;
        }
    }                    
    return 1;
}

¿Alguien por favor tiene algunas ideas?

Respuestas a la pregunta(2)

Su respuesta a la pregunta