Communication série avec un délai minimal

J’ai un ordinateur connecté à des appareils externes via une communication série (c.-à-d. RS-232 / RS-422 de ports série physiques ou émulés). Ils communiquent entre eux par échange fréquent de données (30 Hz) mais avec seulement un petit paquet de données (moins de 16 octets pour chaque paquet).

L’exigence la plus critique de la communication est la faible latence ou le délai entre la transmission et la réception.

Le modèle d’échange de données est semblable à une poignée de main. Un appareil hôte initie la communication et continue d’envoyer des notifications sur un périphérique client. Un périphérique client doit répondre à toutes les notifications du périphérique hôte aussi rapidement que possible (c’est exactement là où la faible latence doit être atteinte). Les paquets de données des notifications et des réponses sont bien définis. à savoir la longueur des données est connue. Et fondamentalement, la perte de données n’est pas autorisée.

J’ai utilisé les fonctions API Win suivantes pour effectuer les opérations d’E / S en lecture / écriture de manière synchrone: CreateFile, ReadFile, WriteFile

Un périphérique client utilise ReadFile pour lire les données d’un périphérique hôte. Une fois que le client lit le paquet de données complet dont la longueur est connue, il utilise WriteFile pour répondre au périphérique hôte avec le paquet de données correspondant. Les lectures et écritures sont toujours séquentielles sans concurrence.

D’une certaine manière, la communication n’est pas assez rapide. A savoir que la durée entre l’envoi et la réception des données est trop longue. Je suppose que cela pourrait être un problème avec la mise en tampon du port série ou les interruptions.

Ici, je résume quelques actions possibles pour améliorer le délai. S’il vous plaît donnez-moi des suggestions et des corrections 🙂

  1. appeler CreateFile avec l’indicateur FILE_FLAG_NO_BUFFERING? Je ne suis pas sûr si ce drapeau est pertinent dans ce contexte.
  2. appeler FlushFileBuffers après chaque WriteFile? ou toute action pouvant notifier / interrompre le port série pour transmettre immédiatement des données?
  3. définir une priorité plus élevée pour les threads et les processus gérant la communication série
  4. définir le temps de latence ou la taille de transfert pour les appareils émulés (avec leur pilote). Mais qu’en est-il du port série physique?
  5. des choses équivalentes sur Windows comme setserial / low_latency sous Linux?
  6. désactiver le FIFO?

Merci d’avance!

J’ai rencontré un problème similaire avec le port série. Dans mon cas, j’ai résolu le problème en diminuant la latence du port série. Vous pouvez modifier la latence de chaque port (qui est défini par défaut sur 16 ms) à l’aide du panneau de commande. Vous pouvez trouver la méthode ici: http://www.chipkin.com/reducing-latency-on-com-ports/

Bonne chance!!!