Lecture de données à partir d’un port série SerCx2-Managed
Un contrôleur série (ou UART) inclut généralement un fiFO de réception. Ce FIFO fournit une mise en mémoire tampon contrôlée par le matériel des données reçues à partir du périphérique connecté au port série. Pour lire les données du fichier FIFO de réception, le pilote de périphérique de cet appareil envoie des requêtes de lecture (IRP_MJ_READ) au port série.
Si le port série continue de recevoir des données plus rapidement que le pilote de périphérique peut lire les données, le fifo de réception peut déborder. Pour éviter la perte de données en raison d’un dépassement de capacité, le pilote de périphérique doit généralement configurer le port série pour utiliser le contrôle de flux matériel. Avec le contrôle de flux, le matériel du contrôleur série signale automatiquement à l’appareil périphérique l’arrêt de l’envoi de données lorsque la réception FIFO est presque saturée. En règle générale, les ports série gérés par SerCx2 doivent utiliser le contrôle de flux matériel. Pour plus d’informations, consultez Détails du contrôle de flux.
Toutefois, le contrôle de flux ne doit pas être utilisé pour empêcher l’appareil périphérique d’envoyer des données pendant trop longtemps ou l’appareil peut ne pas continuer à fonctionner correctement. Par exemple, le périphérique peut avoir une mémoire tampon de données interne qui peut déborder si l’appareil est empêché pendant trop longtemps d’envoyer des données de cette mémoire tampon vers le port série.
Dans cette page
- Utilisation de demandes de lecture asynchrones
- Détails du délai d’attente d’intervalle
- Détails du contrôle de flux
Utilisation de demandes de lecture asynchrones
Pour éviter un fonctionnement incorrect et une éventuelle perte de données, le pilote de périphérique est responsable de la lecture des données à partir de la réception FIFO du contrôleur série en temps opportun. En règle générale, avant la réception des données, le pilote de périphérique envoie une demande de lecture asynchrone au port série en prévision de l’arrivée future des données du périphérique. Cette demande de lecture reste en attente dans la file d’attente d’E/S SerCx2 jusqu’à ce que les données soient disponibles pour être lues à partir du FIFO de réception.
Sur la plupart des plateformes matérielles, un pilote de périphérique n’a pas besoin d’avoir plusieurs demandes de lecture en attente à la fois. Dans de rares cas, un pilote peut avoir besoin de plusieurs demandes de lecture en attente si, une fois les données reçues, le traitement d’une demande de lecture prend tellement de temps avant de pouvoir être effectué que la sauvegarde de données résultante entraîne la perte de données ou le comportement incorrect du périphérique.
En supposant que le pilote de périphérique n’a qu’une seule demande de lecture en attente à la fois, la taille requise de la mémoire tampon de données dans cette requête dépend en grande partie du comportement connu du périphérique. Par exemple, si le pilote connaît à l’avance le nombre d’octets de données à attendre de l’appareil, il définit la taille de la mémoire tampon dans la requête sur ce nombre d’octets. La demande de lecture est terminée dès que la mémoire tampon est remplie avec les données du FIFO de réception. En réponse, le pilote peut envoyer de façon asynchrone une nouvelle demande de lecture pour attendre le bloc de données suivant.
Toutefois, le pilote de périphérique peut ne pas savoir à l’avance la quantité de données à attendre du périphérique. Dans ce cas, le pilote définit la mémoire tampon de données dans la demande de lecture sur une taille appropriée, puis s’appuie sur un délai d’expiration d’intervalle pour identifier la fin des données du périphérique. Le choix d’une taille appropriée pour la mémoire tampon de lecture peut nécessiter des connaissances détaillées sur le fonctionnement du périphérique. Si la mémoire tampon de lecture est trop petite, le pilote doit envoyer une ou plusieurs demandes de lecture supplémentaires pour terminer la lecture des données.
Détails du délai d’attente d’intervalle
Pour définir les paramètres de délai d’attente pour les demandes de lecture et d’écriture, un pilote de périphérique peut envoyer une requête IOCTL_SERIAL_SET_TIMEOUTS au port série. Les délais d’attente pour les lectures sont contrôlés par les valeurs des paramètres ReadIntervalTimeout, ReadTotalTimeoutMultiplier et ReadTotalTimeoutConstant dans cette requête. ReadIntervalTimeout spécifie l’intervalle de temps maximal autorisé entre deux octets consécutifs dans une transaction de réception. Si ReadTotalTimeoutMultiplier et ReadTotalTimeoutConstant sont tous les deux zéros, et que la réception FIFO du contrôleur série est vide lorsqu’une demande de lecture est envoyée au port série, cette requête n’expire pas (et reste donc en attente dans la file d’attente D/S SerCx2) tant que le port n’a pas reçu au moins un octet de nouvelles données. Pour plus d’informations, consultez SERIAL_TIMEOUTS.
Un port série sur un circuit intégré Système sur puce (SoC) peut être en mesure de recevoir des données à partir d’un périphérique à des débits de pointe de plusieurs mégabits par seconde ou plus. Le développeur du pilote de périphérique pour cet appareil peut être tenté de définir la valeur du délai d’attente d’intervalle (comme spécifié par le paramètre ReadIntervalTimeout ) sur une milliseconde ou moins, mais cette valeur est peu susceptible d’avoir l’effet souhaité. En effet, la précision du minuteur utilisé pour détecter les délais d’attente d’intervalle est limitée par la granularité de l’horloge système.
Par exemple, si la période d’horloge système est de 15 millisecondes et que le pilote définit la valeur ReadIntervalTimeout sur 1 milliseconde, un intervalle octet-octet n’importe où dans la plage comprise entre 0 et un peu plus de 15 millisecondes peut déclencher un délai d’attente. Parfois, ce paramètre peut entraîner un délai d’attente au milieu d’une transmission de données à partir du périphérique. Pour s’assurer qu’un délai d’attente ne peut se produire qu’une fois cette transmission terminée, le pilote peut définir ReadIntervalTimeout sur une valeur légèrement supérieure à 15 millisecondes. Par exemple, si ReadIntervalTimeout est défini sur 20 millisecondes, un intervalle d’octets à octets de 30 millisecondes déclenche de manière fiable un délai d’expiration, et un intervalle de 15 millisecondes ou moins ne déclenche pas de délai d’attente.
Pour plus d’informations sur la façon dont la précision du minuteur dépend de l’horloge système, consultez Précision du minuteur.
Détails du contrôle de flux
En guise de bonne pratique, les pilotes de périphérique qui utilisent des ports série gérés par SerCx2 doivent configurer ces ports pour utiliser le contrôle de flux matériel afin d’empêcher le dépassement de capacité fiFO de réception. En l’absence d’une demande de lecture en attente, SerCx2 ne fournit aucune mise en mémoire tampon logicielle des données de réception qui dépasse la capacité du FIFO de réception. Si ce FIFO est autorisé à déborder, les données sont perdues.
Pour activer le contrôle de flux matériel, un pilote de périphérique peut envoyer une demande de IOCTL_SERIAL_SET_HANDFLOW pour définir les paramètres de négociation et de contrôle de flux pour le port série. Ou bien, le pilote peut envoyer une demande de IOCTL_SERIAL_APPLY_DEFAULT_CONFIGURATION pour configurer le port série afin d’utiliser un ensemble de paramètres matériels par défaut qui incluent le contrôle de flux matériel. La demande IOCTL_SERIAL_SET_HANDFLOW utilise la structure SERIAL_HANDFLOW pour décrire les paramètres de contrôle de flux. Une demande IOCTL_SERIAL_APPLY_DEFAULT_CONFIGURATION peut contenir des informations similaires dans un format de données spécifié par le fournisseur.
Si le pilote de périphérique utilise une demande de IOCTL_SERIAL_SET_HANDFLOW pour activer le contrôle de flux matériel, le pilote doit définir les indicateurs suivants dans la structure SERIAL_HANDFLOW de cette requête :
- Indicateur SERIAL_CTS_HANDSHAKE dans le membre ControlHandShake de la structure. Cet indicateur permet au port série d’utiliser le contrôle de flux pour les opérations de réception.
- Indicateurs SERIAL_RTS_CONTROL et SERIAL_RTS_HANDSHAKE dans le membre FlowReplace . Ces indicateurs permettent au port série d’utiliser le contrôle de flux pour les opérations de transmission.