Section courante

A propos

Section administrative du site

 Langage  Elément  Tutoriel  Programmation  Emulateur  Annexe  Aide 
ABAP/4
Ada
Assembleur
Assembly & bytecode
ASP (Active Server Pages)
Basic
C
C++
C# (C Sharp)
Cobol
ColdFusion
Fortran
HTML
Java
JavaScript
LISP
Logo
LotusScript
Oberon
Pascal
Perl
PHP
PL/1
Prolog
Python
Rebol
REXX
Ruby
Rust
SAS
NoSQL
SQL
Swift
X++ (Axapta)
GNAT
SMALLAda
VHDL
Assembleur 370
Assembleur 1802
Assembleur 4004
Assembleur 6502
Assembleur 6800
Assembleur 68000
Assembleur 8080 et 8085
Assembleur 8089
Assembleur 80x86
Assembleur AGC4
Assembleur ARM
Assembleur DPS 8000
Assembleur i860
Assembleur Itanium
Assembleur MIPS
Assembleur PDP-11
Assembleur PowerPC
Assembleur RISC-V
Assembleur SPARC
Assembleur SuperH
Assembleur UNIVAC I
Assembleur VAX
Assembleur Z80
Assembleur Z8000
Assembleur z/Architecture
ASSEMBLER/MONITOR 64
Micol Assembler
GFA Assembler
A86
MASM (Macro Assembler)
TASM (Turbo Assembler)
CIL
Jasmin
LLVM
MSIL
Parrot
P-Code (PCode)
SWEET16
G-Pascal
ASP 1.0
ASP 2.0
ASP 3.0
ASP.NET
ASP.NET Core
ABasiC (Amiga)
Adam SmartBASIC
Altair BASIC
AmigaBASIC (Amiga)
AMOS Basic (Amiga)
Atari Basic (Atari 400, 600 XL, 800, 800XL)
Basic Apple II (Integer BASIC/APPLESOFT)
Basic Commodore 64 (CBM-BASIC)
Basic Commodore 128 (BASIC 7.0)
Basic Commodore VIC-20 (CBM-BASIC 2.0)
Basic Coco 1 (Color Basic)
Basic Coco 2 (Extended Color Basic)
Basic Coco 3 (Extended Color Basic 2.0)
BASICA (PC DOS)
Basic Pro
BBC BASIC
Blitz BASIC (Amiga)
DarkBASIC
Dartmouth BASIC
GFA-Basic (Atari ST/Amiga)
GWBASIC (MS-DOS)
Liberty BASIC
Locomotive BASIC (Amstrad CPC)
MSX-Basic
Omikron Basic (Atari ST)
Oric Extended Basic
Power Basic
Quick Basic/QBasic (MS-DOS)
Sinclair BASIC (ZX80, ZX81, ZX Spectrum)
ST BASIC (Atari ST)
Turbo Basic
Vintage BASIC
VBScript
Visual Basic (VB)
Visual Basic .NET (VB .NET)
Visual Basic pour DOS
Yabasic
BeckerBASIC
SIMONS' BASIC
Basic09 d'OS-9
Disk Extended Color Basic
Basic09 d'OS-9
Disk Extended Color Basic
Access
Excel
Visual Basic pour Windows
Visual Basic .NET pour Windows
C Shell Unix (csh)
C pour Amiga
C pour Atari ST
C pour DOS
C pour Falcon030
C pour GEMDOS (Atari ST)
C pour Linux
C pour PowerTV OS
C pour OS/2
C pour Unix
C pour Windows
Aztec C
CoCo-C
GNU C
HiSoft C
IBM C/2
Introl-C
Lattice C
Microsoft C
MinGW C
MSX-C
Open Watcom C
OS-9 C Compiler
Pure C
Quick C
Turbo C
HiSoft C for Atari ST
HiSoft C for CP/M (Amstrad CPC)
C++ pour OS/2
C++ pour Windows
Borland C++
C++Builder
IBM VisualAge C++
Intel C++
MinGW C++
Open Watcom C++
Symantec C++
Turbo C++
Visual C++
Visual C++ .NET
Watcom C++
Zortech C++
C# (C Sharp) pour Windows
Apple III Cobol
Microsoft Cobol
BlueDragon
Lucee
OpenBD
Railo
Smith Project
Microsoft Fortran
WATFOR-77
CSS
FBML
Open Graph
SVG
XML
XSL/XSLT
LESS
SASS
GCJ (GNU)
JSP
Jython
Visual J++
Node.js
TypeScript
AutoLISP
ACSLogo
LotusScript pour Windows
Amiga Oberon
Oberon .NET
Apple Pascal
Delphi/Kylix/Lazarus
Free Pascal
GNU Pascal
HighSpeed Pascal
IBM Personal Computer Pascal
Lisa Pascal
Maxon Pascal
MPW Pascal
OS-9 Pascal
OSS Personal Pascal
Pascal-86
Pascal du Cray Research
Pascal/VS
Pascal-XT
PURE Pascal
QuickPascal
RemObjets Chrome
Sun Pascal
THINK Pascal
Tiny Pascal (TRS-80)
Turbo Pascal
UCSD Pascal
VAX Pascal
Virtual Pascal
Turbo Pascal for CP/M-80
Turbo Pascal for DOS
Turbo Pascal for Macintosh
Turbo Pascal for Windows
CodeIgniter (Cadre d'application)
Drupal (Projet)
Joomla! (Projet)
Phalanger (PHP .NET)
phpBB (Projet)
Smarty (balise)
Twig (balise)
Symfony (Cadre d'application)
WordPress (Projet)
Zend (Cadre d'application)
PL360
PL/M-80
PL/M-86
Turbo Prolog
CPython
IronPython
Jython
PyPy
AREXX
Regina REXX
JMP
Btrieve
Cassandra
Clipper
CouchDB
dBASE
Hbase
Hypertable
MongoDB
Redis
Access
BigQuery
DB2
H2
Interbase
MySQL
Oracle
PostgreSQL
SAP HANA
SQL Server
Sybase
U-SQL
Introduction
Les remarques
Les opérateurs
Les instructions conditionnelles
Les instrucions de boucles
Référence de commandes et fonctions
Les premiers pas
Introduction à la programmation
Traitement des chiffres
Programmes - analyse, mots clefs et jetons
Réviser et pratiquer GW-BASIC
L'éditeur d'écran GW-BASIC
Créer et utiliser des fichiers
Constantes, variables, expressions et opérateurs
Graphiques
Communications désynchronisées
Sous-programmes de langage d'assemblage (code machine)
Conversion des programmes BASIC en GW-BASIC
Bonjour
Application
Biochimie
Géométrie
Jeux & stratégies
Météorologie
Sport
Temps
Trigonométrie
Dessin Bitmap
Calcul du calcium corrigé
Aire d'un cercle
Aire d'une surface de prisme rectangulaire
Aire d'un triangle
Distance entre deux points
L25
Unité de mesure
Hockey
Année bissextile
ArcCos
ArcSin
DOSBox
PCE - PC Emulator
PCem
Raccourci clavier (Shortcut Keys)
Références des codes d'erreur du GWBASIC
Fonctions mathématiques
Codes de caractères ASCII
Équivalents hexadécimaux
Codes de balayage des touches
Caractères reconnus par GW-BASIC
Références des adresses de cellule mémoire du «PC IBM»
Encodage des fichiers «.BAS» du GWBASIC
Vocabulaire
Table ASCII
Table de codes ANSI et page de codes
Préface
Notes légal
Dictionnaire
Recherche

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.


PARTAGER CETTE PAGE SUR
Dernière mise à jour : Samedi, le 9 septembre 2017