J'ai un protocole USB que je veux implémenter mais je suis un peu perdu sur la meilleure façon de le faire.Conception du programme pour la mise en œuvre du protocole USB
Le protocole USB implique l'échange de données et des paquets d'accusé de réception avant et en arrière comme si:
Device: data
Host: ACK
Host: reply
Device: ACK
Mais parfois, les paquets peuvent venir de manière asynchrone comme ceci:
Device: data #1
Device: data #2
Host: ACK #1
...
Je veux avoir une API Cela permettra de faire abstraction de tous les détails de l'USB et de faire fonctionner le programme avec les données réelles sans avoir à se soucier des en-têtes de paquets ou de reconnaître les paquets ou quelque chose comme ça. Idéalement, il y aura une fonction write_to_device
qui bloque jusqu'à ce que le périphérique reconnaisse le paquet, une read_from_device
qui bloquera jusqu'à ce qu'un paquet soit reçu et une fonction is_data_available
qui renvoie immédiatement s'il y a des données dans la file d'attente.
Je pense à exécuter un thread séparé qui gère les événements USB. Ce thread va gérer toute l'encapsulation et la reconnaissance des données.
Lorsqu'un paquet arrive, le thread de traitement envoie un paquet ACK puis extrait et écrit les données brutes dans un canal. La fonction read_from_device
(appelée à partir du thread principal) lira simplement à partir de ce tuyau et bloquera naturellement jusqu'à ce qu'il y ait des données. Mais si j'utilise ce schéma, je n'aurai pas une manière propre d'implémenter une fonction is_data_available
- il n'y a aucun moyen de vérifier s'il y a des données dans un tube sans le lire.
Quelque chose comme ceci:
[ Main thread ][ Processing thread ]
| Read from pipe || |
| || USB packet comes in |
| || Send ACK packet |
| || Extract data |
| || Write data to pipe |
| Read succeeds || |
| Return data || |
La vraie question est implémenter une fonction write_to_device
. Comment puis-je mettre en œuvre de manière propre un moyen d'envoyer le paquet, attendre un paquet d'accusé de réception, puis retourner?
Cela n'a aucun sens, l'USB l'implémente déjà. Notez le paquet de prise de contact ACK dans cette description: http://www.beyondlogic.org/usbnutshell/usb3.shtml –
L'ACK est requis au niveau du protocole d'application. – tangrs