Si esto es para un microcontrolador, porque no implementar una maquina de estado cuando este recibiendo para que separe los datos a medida que entran?
En ves de juntar todo en un buffer y luego tratar de dividirlo.
Respecto al codigo, strtok tiene que determinar el comienzo y el fin del string, para determinar el comienzo busca algun caracter que no se encuentre en la lista de token
Mientras que el final busca por el token y al encontrarlo lo reemplaza por un caracter nulo
Por eso mismo cuando tenes:
,b,,d,
El primer caracter pertenece al token, por lo tanto lo omite y llega a 'b'. ahi comienza, y finaliza en la coma que esta al lado.
Si observamos ahora nuestro texto quedarias asi:
,b\0,d, Siendo lo que le falta ,d,
Al ejecutarlo de nuevo al strtok, como comienza de nuevo con la coma entonces lo omite y comienza desde 'd'. Por eso mismo tenes 2 nomas y no 4.
La otra seria crear tu propia funcion que genere la salida que estas buscando