Un moyen de convertir un flux d'octets en un flux de paquets en C89 sur un périphérique intégré [fermé]

StackOverflow https://stackoverflow.com/questions/815029

  •  03-07-2019
  •  | 
  •  

Question

Je & # 8217; travaille avec un périphérique intégré connecté à un PC via RS232 (RS232 via USB).

Je & # 8217; Je songe à développer mon propre protocole:

<MAGIC><LENGTH><BINARY DATA><CRC>

mais je & # 8217; je ne veux pas réinventer la roue.

Veuillez noter : Je pense à un périphérique assez restreint: 4 Ko de RAM, pas de noyau, ni de librairie C standard.

Pouvez-vous penser à un moyen standard de faire cela (peut-être une bibliothèque open source)?

Si vous codez votre propre solution, existe-t-il des meilleures pratiques?

  • Utilisez-vous les octets MAGIC également à la fin des packages?
  • Peut-être est-il préférable d'utiliser des décalages horaires plutôt que des délimiteurs?
  • Comment trouvez-vous le début des packages dans un flux de données binaires?
  • Peut-être est-il préférable d'utiliser des protocoles de texte?

MISE À JOUR: Veuillez relire la question. Je ne devrais pas demander de bibliothèque, mais de bonnes pratiques.

Était-ce utile?

La solution

Voir cette réponse que j'ai donnée à une question très similaire concernant les détails d’un protocole simple.

Pour répondre à vos points spécifiques:

  1. " Magic " les octets à la fin des paquets ne font pas de mal, mais ils sont redondants si vous savez déjà combien de temps le paquet est censé être et avez un CRC.
  2. Il peut être judicieux de spécifier des délais d'expiration. Par conséquent, si l'écart entre les octets est trop grand dans un même paquet, une erreur est alors signalée. Après avoir utilisé Modbus , je ne suis pas convaincu de l'intérêt d'utiliser des délimiteurs temporels ailleurs.
  3. Voulez-vous dire & "comment trouvez-vous le début des paquets dans un flux de données binaires &"; Si tel est le cas, spécifiez peut-être un espace minimum entre les paquets et / ou demandez au destinataire d'acknolwedge après chaque paquet.
  4. Facilite le débogage et ne nécessite aucun logiciel spécial sur le PC, mais n’est pas très efficace. Bien sûr, si la convivialité est plus importante que l’efficacité, un système textuel est tout à fait approprié.

Autres conseils

Dans ce cas, il aurait été plus facile de réinventer la roue au moment où une solution existante fonctionne sur votre appareil.

void buffer_packet(unsigned char rx_byte)
{
    static unsigned char byte_count = 0;
    static unsigned char packet[8];

    packet[byte_count++] = rx_byte;
    if (byte_count == 8)
    {
        unsigned char crc = calculate_crc(packet, 8);

        write_uart(0x55);
        write_uart(8);
        while (byte_count--)
        {
            write_uart(packet[7 - byte_count]);
        }
        write_uart(crc);
    }
}

Ou peut-être que je sous-estime votre problème. Si vous cherchez à générer les bits RS232, consultez la fiche technique de votre microcontrôleur.

Le calcul du CRC est la seule chose à part vos primitives d'E / S. Il existe un article intéressant, avec le code, ici .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top