Section courante

A propos

Section administrative du site

Communications désynchronisées

L'instruction OPEN COMmunications alloue un tampon pour l'entrée et la sortie de la même manière que l'instruction OPEN pour les fichiers disque.

Communication d'entrée/sortie

Étant donné que le port de communication est ouvert en tant que fichier, toutes les instructions d'entrée/sortie valides pour les fichiers disque sont valides pour COM. Les instructions d'entrée séquentielles COM sont les mêmes que celles des fichiers disque. Ce sont : INPUT #, LINE INPUT # et la fonction INPUT$. Les instructions de sortie séquentielle COM sont les mêmes que celles du disque et sont : PRINT #, PRINT # USING et WRITE #. Les instructions GET et PUT ne sont que légèrement différentes pour les fichiers COM.

Fonctions d'entrées/sorties de communication

L'aspect le plus difficile de la communication désynchronisé est de pouvoir traiter les caractères aussi vite qu'ils sont reçus. À des débits supérieurs à 2400 bps, il peut être nécessaire de suspendre la transmission de caractères depuis l'ordinateur hôte suffisamment longtemps pour rattraper le retard. Cela peut être fait en envoyant XOFF(CHR$(19)) à l'hôte et XON(CHR$(17)) lorsqu'il est prêt à reprendre. Le GWBASIC fournit trois fonctions aidant à déterminer quand une condition de dépassement est imminente. Ceux-ci sont :

Fonction Description
LOC(f) Renvoie le nombre de caractères dans le tampon d'entrée en attente de lecture. Le tampon d'entrée peut contenir plus de 255 caractères (déterminés par le paramètre /C:). S'il y a plus de 255 caractères dans le tampon, LOC(f) renvoie 255. Puisqu'une chaîne de caractères est limitée à 255 caractères, cette limite pratique signifie que vous n'avez pas à tester la taille de la chaîne de caractères avant d'y lire des données. S'il reste moins de 255 caractères dans le tampon, LOC(f) renvoie le décompte actuel.
LOF(f) Renvoie la quantité d'espace libre dans le tampon d'entrée. Autrement dit, size-LOC(f), où «size» est la taille du tampon de communication tel que défini par le paramètre /C:. LOF peut être utilisé pour détecter lorsque le tampon d'entrée atteint sa capacité maximale.
EOF(f) Si vrai (-1), indique que le tampon d'entrée est vide. Renvoie faux (0) si des caractères attendent d'être lus.

Erreurs possibles

La fonction INPUT$ pour les fichiers COM

La fonction INPUT$ est préférable aux instructions INPUT# et LINE INPUT # lors de la lecture de fichiers COM, car tous les caractères ASCII peuvent être importants dans les communications. INPUT # est le moins souhaitable car l'entrée s'arrête lorsqu'une virgule (,) ou CR est reçue et LINE INPUT # se termine lorsqu'un CR est reçu. La fonction INPUT$ permet à tous les caractères lus d'être affectés à une chaîne de caractères. La fonction INPUT$(n, f) renverra n caractères du fichier #f. Les instructions suivantes sont donc les plus efficaces pour lire un fichier COM :

  1. 10 WHILE NOT EOF(1)
  2. 20 A$ = INPUT$(LOC(1),#1]
  3. 30
  4. 40 ... ' Données de processus renvoyées en A$
  5. 50 ... 
  6. 60 WEND

Les instructions ci-dessus renvoient les caractères du tampon dans A$ et les traitent, à condition qu'il y ait des caractères dans le tampon. S'il y a plus de 255 caractères, seuls 255 seront renvoyés à la fois pour éviter le débordement de chaîne de caractères. Si tel est le cas, EOF(1) est faux et l'entrée continue jusqu'à ce que le tampon d'entrée soit vide. La séquence des événements est donc simple, concise et rapide.

Instructions GET et PUT pour les fichiers COM

Objectif

Pour autoriser les entrées/sorties de longueur fixe pour COM.

Syntaxe

GET filenumber, nbytes
PUT filenumber, nbytes

Commentaires

filenumber est une expression entière renvoyant un numéro de fichier valide.

nbytes est une expression entière renvoyant le nombre d'octets à transférer dans ou hors du tampon de fichier. nbytes ne peut pas dépasser la valeur définie par le commutateur /s: lorsque GW-BASIC a été appelé.

En raison des faibles performances associées aux communications par ligne téléphonique, il est recommandé de ne pas utiliser GET et PUT dans de telles applications.

Exemple

L'exemple de programme TTY suivant est un exercice d'entrée/sortie de communication. Il est conçu pour permettre à votre ordinateur d'être utilisé comme un terminal classique. Outre les communications en duplex intégral avec un hôte, le programme TTY permet de télécharger des données dans un fichier. Inversement, un fichier peut être téléchargé (transmis) vers une autre machine.

En plus de démontrer les éléments des communications désynchronisés, ce programme est utile pour transférer des programmes et des données GW-BASIC vers et depuis un ordinateur.

Note

Voici un exemple de programme TTY :

  1. 10 SCREEN 0,0:WIDTH 80
  2. 15 KEY OFF:CLS:CLOSE
  3. 20 DEFINT A-Z
  4. 25 LOCATE 25,1
  5. 30 PRINT STRING$(60," ")
  6. 40 FALSE=0:TRUE=NOT FALSE
  7. 50 MENU=5 'Valeur du la touche MENU (^E)
  8. 60 XOFF$=CHR$(19):XON$=CHR$(17)
  9. 100 LOCATE 25,1:PRINT "Programme désynchronisé TTY";
  10. 110 LOCATE 1,1:LINE INPUT "Vitesse?";"SPEED$
  11. 120 COMFIL$="COM1:,+SPEED$+",E,7"
  12. 130 OPEN COMFIL$ AS #1
  13. 140 OPEN "SCRN:"FOR OUTPUT AS #3
  14. 200 PAUSE=FALSE
  15. 210 A$=INKEY$:IF A$=""THEN 230
  16. 220 IF ASC(A$)=MENU THEN 300 ELSE PRINT #1,A$;
  17. 230 IF EOF(1) THEN 210
  18. 240 IF LOC(1)>128 THEN PAUSE=TRUE:PRINT #1,XOFF$;
  19. 250 A$=INPUT$(LOC(1),#1)
  20. 260 PRINT #3,A$;:IF LOC(1)>0 THEN 240
  21. 270 IF PAUSE THEN PAUSE=FALSE:PRINT #1,XON$;
  22. 280 GOTO 210
  23. 300 LOCATE 1,1:PRINT STRING$(30,32):LOCATE 1,1
  24. 310 LINE INPUT "FILE?";DSKFIL$
  25. 400 LOCATE 1,1:PRINT STRING$(30,32):LOCATE 1,1
  26. 410 LINE INPUT"(T)ransmis ou (R)eçu?";TXRX$
  27. 420 IF TXRX$="T" THEN OPEN DSKFIL$ FOR INPUT AS #2:GOTO 1000
  28. 430 OPEN DSKFIL$ FOR OUTPUT AS #2
  29. 440 PRINT #1,CHR$(13);
  30. 500 IF EOF(1) THEN GOSUB 600
  31. 510 IF LOC(1)>128 THEN PAUSE=TRUE:PRINT #1,XOFF$;
  32. 520 A$=INPUT$(LOC(1),#1)
  33. 530 PRINT #2,A$;:IF LOC(1)>0 THEN 510
  34. 540 IF PAUSE THEN PAUSE=FALSE:PRINT #1,XON$;
  35. 550 GOTO 500
  36. 600 FOR I=1 TO 5000
  37. 610 IF NOT EOF(1) THEN I=9999
  38. 620 NEXT I
  39. 630 IF I>9999 THEN RETURN
  40. 640 CLOSE #2;CLS:LOCATE 25,10:PRINT "* Téléchargement complété *";
  41. 650 RETURN 200
  42. 1000 WHILE NOT EOF(2)
  43. 1010 A$=INPUT$(1,#2)
  44. 1020 PRINT #1,A$;
  45. 1030 WEND
  46. 1040 PRINT #1,CHR$(28);^Z to make close file.
  47. 1050 CLOSE #2:CLS:LOCATE 25,10:PRINT "** Téléversement complété **";
  48. 1060 GOTO 200
  49. 9999 CLOSE:KEY ON

Remarques sur l'exemple de programme TTY

Note

Numéro de ligne Commentaires
10 Définit SCREEN en mode alpha noir et blanc et définit la largeur sur 80.
15 Désactive l'affichage des touches programmables, efface l'écran et s'assure que tous les fichiers sont fermés.
20 Définit toutes les variables numériques comme des entiers, principalement pour le bénéfice de la sous-routine à 600 à 620. Tout programme à la recherche d'une optimisation de la vitesse doit utiliser des compteurs entiers dans des boucles lorsque cela est possible.
40 Définit booléen vrai et faux.
50 Définit la valeur ASCII (ASC) de la touche MENU.
60 Définit les caractères ASCII XON et XOFF.
100 à 130 Affiche l'ID du programme et demande le débit en bauds (vitesse). Ouvre les communications vers le fichier numéro 1, parité paire, 7 bits de données.
200 à 280 Cette section effectue des entrées/sorties en duplex intégral entre l'écran vidéo et l'appareil connecté au connecteur RS-232 comme suit :
  • Lire un caractère du clavier en A$. INKEY$ renvoie une chaîne de caractères nulle si aucun caractère n'est en attente.
  • Si un caractère du clavier est disponible, en attente, alors :
    • Si le caractère est la touche MENU, l'opérateur est prêt à télécharger un fichier. Obtenir le nom du fichier.
    • Si le caractère (A$) n'est pas la touche MENU l'envoyer en écrivant dans le fichier de communication (PRINT #1...).
  • Si aucun caractère n'est en attente, vérifiez si des caractères sont reçus.
  • A 230, voir si des caractères attendent dans le tampon COM. Sinon, revenez en arrière et vérifiez le clavier.
  • En 240, si plus de 128 caractères sont en attente, établir l'indicateur PAUSE pour indiquer que l'entrée est suspendue. Envoie XOFF à l'hôte, arrêtant toute transmission ultérieure.
  • À 250 à 260, lire et afficher le contenu du tampon COM à l'écran jusqu'à ce qu'il soit vide. Continuez à surveiller la taille du tampon COM (en 240). Suspendre la transmission si la réception prend du retard.
  • Reprendre la transmission de l'hôte en envoyant XON uniquement s'il a été suspendu par XOFF précédent.
  • Répétez le processus jusqu'à ce que la touche MENU soit enfoncée.
300 à 320 Obtenir le nom du fichier du disque sur lequel télécharger. Ouvrez le fichier sous le numéro 2.
400 à 420 Demande si le fichier nommé doit être transmis (téléversement) ou reçu (téléchargé).
430 Recevez la routine. Envoie un RETURN à l'hôte pour commencer le téléchargement. Ce programme suppose que la dernière commande envoyée à l'hôte était de commencer un tel transfert et qu'il ne manquait que le retour final. Si un système DEC est l'hôte, une telle commande peut être :

COPY TTY:=MANUAL.MEM (touche MENU)

si la touche MENU a été frappée au lieu de RETURN.
500 Lorsqu'il n'y a plus de caractères reçus, (LOC(x) renvoie 0), puis exécute une routine de temporisation.
510 Si plus de 128 caractères sont en attente, signalez une pause et envoyez XOFF à l'hôte.
520 à 530 Lire tous les caractères de la file d'attente COM (LOC(x)) et les écrire sur la disquette (PRINT #2...) jusqu'à ce que la réception rattrape la transmission.
540 à 550 Si une pause est émise, redémarrez l'hôte en envoyant XON et en effaçant l'indicateur de pause. Continuez le processus jusqu'à ce qu'aucun caractère ne soit reçu pendant une durée prédéterminée.
600 à 650 Sous-programme de temporisation. Le nombre de boucles FOR a été déterminé par expérimentation. Si aucun caractère n'est reçu de l'hôte pendant 17 à 20 secondes, la transmission est supposée terminée. Si un caractère quelconque est reçu pendant ce temps (ligne 610), placez n bien au-dessus de la plage de la boucle FOR pour quitter la boucle et retourner à l'appelant. Si la transmission à l'hôte est terminée, fermez le fichier disque et reprenez les activités normales.
1000 à 1060 Routine de transmission. Jusqu'à la fin du fichier disque, lisez un caractère dans A$ avec l'instruction INPUT$. Envoyer le caractère au périphérique COM en 1020. Envoyer un ^Z à la fin du fichier en 1040 au cas où le périphérique de réception en aurait besoin pour fermer son fichier. Les lignes 1050 et 1060 ferment le fichier disque, impriment le message de fin et reviennent en mode conversation à la ligne 200.
9999 Actuellement non exécuté. A titre d'exercice, ajoutez quelques lignes à la routine 400 à 420 pour quitter le programme via la ligne 9999. Cette ligne ferme le fichier COM laissé ouvert et restaure l'affichage des touches de fonction.


Dernière mise à jour : Samedi, le 9 septembre 2017