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
- Débordement de la mémoire tampon de communication : Si une lecture est tentée après que le tampon d'entrée est plein, (c'est-à-dire que LOF (f) renvoie 0).
- Erreur d'entrée/sortie de périphérique : Si l'une des conditions de ligne suivantes est détectée à la réception : erreur de dépassement (OE), erreur de trame (FE) ou interruption de rupture (BI). L'erreur est réinitialisée par les entrées suivantes mais le caractère à l'origine de l'erreur est perdu.
- Erreur de périphérique : Si l'ensemble de données prêt (DSR) est perdu pendant les entrées/sorties.
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 :
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
- Ce programme est configuré pour communiquer avec un DEC System-20 en particulier lors de l'utilisation de XON et XOFF. Il peut nécessiter des modifications pour communiquer avec d'autres types de matériel.
Voici un exemple de programme TTY :
- 10 SCREEN 0,0:WIDTH 80
- 15 KEY OFF:CLS:CLOSE
- 20 DEFINT A-Z
- 25 LOCATE 25,1
- 30 PRINT STRING$(60," ")
- 40 FALSE=0:TRUE=NOT FALSE
- 50 MENU=5 'Valeur du la touche MENU (^E)
- 60 XOFF$=CHR$(19):XON$=CHR$(17)
- 100 LOCATE 25,1:PRINT "Programme désynchronisé TTY";
- 110 LOCATE 1,1:LINE INPUT "Vitesse?";"SPEED$
- 120 COMFIL$="COM1:,+SPEED$+",E,7"
- 130 OPEN COMFIL$ AS #1
- 140 OPEN "SCRN:"FOR OUTPUT AS #3
- 200 PAUSE=FALSE
- 210 A$=INKEY$:IF A$=""THEN 230
- 220 IF ASC(A$)=MENU THEN 300 ELSE PRINT #1,A$;
- 230 IF EOF(1) THEN 210
- 240 IF LOC(1)>128 THEN PAUSE=TRUE:PRINT #1,XOFF$;
- 250 A$=INPUT$(LOC(1),#1)
- 260 PRINT #3,A$;:IF LOC(1)>0 THEN 240
- 270 IF PAUSE THEN PAUSE=FALSE:PRINT #1,XON$;
- 280 GOTO 210
- 300 LOCATE 1,1:PRINT STRING$(30,32):LOCATE 1,1
- 310 LINE INPUT "FILE?";DSKFIL$
- 400 LOCATE 1,1:PRINT STRING$(30,32):LOCATE 1,1
- 410 LINE INPUT"(T)ransmis ou (R)eçu?";TXRX$
- 420 IF TXRX$="T" THEN OPEN DSKFIL$ FOR INPUT AS #2:GOTO 1000
- 430 OPEN DSKFIL$ FOR OUTPUT AS #2
- 440 PRINT #1,CHR$(13);
- 500 IF EOF(1) THEN GOSUB 600
- 510 IF LOC(1)>128 THEN PAUSE=TRUE:PRINT #1,XOFF$;
- 520 A$=INPUT$(LOC(1),#1)
- 530 PRINT #2,A$;:IF LOC(1)>0 THEN 510
- 540 IF PAUSE THEN PAUSE=FALSE:PRINT #1,XON$;
- 550 GOTO 500
- 600 FOR I=1 TO 5000
- 610 IF NOT EOF(1) THEN I=9999
- 620 NEXT I
- 630 IF I>9999 THEN RETURN
- 640 CLOSE #2;CLS:LOCATE 25,10:PRINT "* Téléchargement complété *";
- 650 RETURN 200
- 1000 WHILE NOT EOF(2)
- 1010 A$=INPUT$(1,#2)
- 1020 PRINT #1,A$;
- 1030 WEND
- 1040 PRINT #1,CHR$(28);^Z to make close file.
- 1050 CLOSE #2:CLS:LOCATE 25,10:PRINT "** Téléversement complété **";
- 1060 GOTO 200
- 9999 CLOSE:KEY ON
Remarques sur l'exemple de programme TTY
Note
- Désynchronisé implique des entrées/sorties de caractère par opposition aux entrées/sorties de ligne ou de bloc. Par conséquent, toutes les impressions (vers le fichier COM ou l'écran) se terminent par un point-virgule (;). Cela retarde le saut de ligne de retour normalement émis à la fin de l'instruction PRINT.
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 :
|
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. |