CC90
Transferts série pour le Thomson
Mars 2015 © Prehisto et OncleTom
Version 1.04 pour Windows et Linux

TOCOMM va vous permettre de discuter avec votre Thomson sous le Basic des TO9, TO8, TO8D et TO9+. Vous pourrez donc choisir la taille des caractères à transmettre (8 ou 7 bits), la vitesse de transmission (110, 600, 1200, 2400, 4800, 9600 ou 19200 bauds) et la taille d'une ligne.

Côté PC, le programme n'est pas très évolué puisqu'il est surtout destiné à l'intégration dans un programme C, et est donc livré compilé à titre d'exemple. Si certains arguments passés par la ligne de commande sont incorrects, le programme ne s'exécutera tout simplement pas. Veillez donc à ne pas vous tromper.

 

Initialiser le programme Thomson

Pour commencer, il faut d'abord lancer le programme TOCOMM.BIN :

10 CLEAR,&H9000
20 LOADM"TOCOMM",&H9000,R

Le programme TOCOMM.BIN est entièrement translatable, vous pouvez donc l'implanter où bon vous semble, l'offset de chargement faisant foi, dans une zone de quelques 560 octets.

A l'exécution, le vecteur système pointant sur l'entrée Moniteur RSCO$ ("Gestion de l'interface de communication") est remplacé. Vous pourrez alors risquer un SCREENPRINT, et même en 80 colonnes, pour peu que vous ayez branché une imprimante Thomson sur votre CC90-232.

Ouverture du canal pour l'interface de communication

Un réglage personnalisé peut être effectué à l'ouverture du périphérique, écrit entre parenthèses comme pour un commentaire de fichier, juste après le nom du périphérique. Si ce "commentaire" est omis, la transmission se fera à la vitesse 4 (1200 bauds) avec des données 7 bits et une longueur de ligne de 40 caractères.

Le premier chiffre indique la vitesse de transmission :

  • "1" : 110 bauds
  • "2" : 300 bauds
  • "3" : 600 bauds
  • "4" : 1200 bauds
  • "5" : 2400 bauds
  • "6" : 4800 bauds
  • "7" : 9600 bauds
  • "8" : 19200 bauds

Il est malheureusement possible que les vitesses basses ne soient pas supportées par votre liaison série.

Le deuxième chiffre indique la taille des données à transmettre :

  • "7" pour une transmission en 7 bits
  • "8" pour une transmission en 8 bits

Utiliser une transmission de 7 bits ne permet bien sûr pas de transférer autre chose que des caractères ASCII. Il est aussi possible que la transmission 7 bits ne soit pas supportée par votre liaison série, ou même qu'elle traite la liaison 7 bits comme une liaison 8 bits.

Le troisième paramètre peut comporter plusieurs chiffres. Il indique la longueur maximum d'une ligne. Si la ligne à envoyer par le Thomson comporte plus de caractères que déclaré à l'ouverture du périphérique, elle sera tronquée au nombre de caractères spécifié.

Pour ouvrir le périphérique COMM en réception par le canal 1 avec une vitesse de 19200 bauds, 8 bits par donnée et une ligne de 255 caractères maximum, nous aurons par exemple :

100 OPEN"I",#1,"COMM:(88255)"

Pour ouvrir le périphérique COMM en émission par le canal 2 avec une vitesse de 300 bauds, 7 bits par donnée et une ligne de 80 caractères maximum, nous aurons par exemple :

100 OPEN"0",#2,"COMM:(2780)"

Pour ouvrir le périphérique COMM en émission par le canal 2 avec une vitesse de 1200 bauds, 7 bits par donnée et une ligne de 40 caractères maximum, faites simplement :

100 OPEN"0",#2,"COMM:"

Généralités sur la transmission des données

Sachez que le programme qui doit recevoir les données se met toujours attente bloquante, au contraire de la partie qui emet les données, plus impulsive. Dans un cas général, il est préférable que la tâche de réception d'un côté commence avant la tâche d'émission de l'autre. Il suffira alors de faire patienter le programme d'émission en effectuant une petite réception préalable.

Sachez aussi que sous Windows, les données envoyées sont bufférisées puis envoyées sous interruption, ce qui fait qu'elles arriveront à bon port même lorsque le programme n'est plus en activité. Ce qui ne se vérifie pas pour les systèmes Linux.

Le caractère CR (code $0D) est reconnu côté Thomson et côté PC comme terminateur de ligne, et donc comme un caractère de fin d'envoi. Il est par conséquent réservé et ne sera jamais traité en tant que donnée.

Transmission des données sous Basic TO9, TO8, TO8D et TO9+

Pour la transmission de données sous Basic des TO9, TO8, TO8D et TO9+, nous avons 3 instructions à disposition :

  • LINEINPUT pour la réception d'une chaîne de caractères
  • INPUT pour la réception d'une valeur numérique
  • PRINT pour l'émission d'une chaîne de caractères ou d'une valeur numérique

Pour réception d'une chaîne de caractères, il suffira donc de faire :

110 LINEINPUT#1,B$

Pour réception d'une valeur numérique :

110 INPUT#1,A

Pour l'émission d'une chaîne de caractères (la chaîne de caractères peut bien évidemment être remplacée par une variable) :

110 PRINT#1,"Hello world !"

... et enfin pour l'émission d'une valeur numérique (la valeur numérique peut bien évidemment être remplacée par une variable) :

110 PRINT#1,12345

Transmission des données depuis le PC

Côté PC, vous effectuerez les transmissions à l'aide du programme tocomm, que vous lancerez en ligne de commande dans une fenêtre DOS sous Windows ou dans le Terminal sous Linux. Ce programme requiert toutefois quelques arguments :

  • Le nom du périphérique série préférentiellement entre guillemets
  • La vitesse de transmission (de 1 à 8, comme pour le Thomson)
  • La taille des données (7 ou 8, comme pour le Thomson)
  • Le code de transmission : p pour l'envoi d'une chaîne de caractère, i pour l'envoi d'une valeur numérique et s pour la réception d'une chaîne de caractère ou d'une valeur numérique, les deux étant reçues de toute façon sous forme de chaîne
  • La chaîne de caractère ou la valeur numérique à envoyer (argument nécessaire seulement pour l'émission)

Quelques exemples :

Les noms de périphériques sont ici à titre indicatif. Vous chercherez vous-mêmes l'orthographe exacte de votre propre périphérique dans la liste des ports COM sous Windows et dans le répertoire /dev/ sous Linux.

Envoyer la chaîne "Hello World !" au Thomson à une vitesse de 19200 bauds en 8 bits :

WINDOWS
>tocomm "COM3" 8 8 p "Hello World !"
LINUX
$ ./tocomm "/dev/ttyUSB0" 8 8 p "Hello World !"

Envoyer la valeur 256 au Thomson à une vitesse de 2400 bauds en 7 bits :

WINDOWS
>tocomm "COM3" 5 7 i 256
LINUX
$ ./tocomm "/dev/ttyUSB0" 5 7 i 256

Recevoir une chaîne ou une valeur à une vitesse de 600 bauds en 8 bits :

WINDOWS
>tocomm "COM3" 3 8 s
LINUX
$ ./tocomm "/dev/ttyUSB0" 3 8 s

La vitesse et le nombre de bits par donnée doit évidemment correspondre au paramétrage que vous aurez choisi pour la transmission sous Basic.

Fermeture du canal

Une fois que toutes les tâches ont été effectuées, refermer tous les canaux utilisés côté Thomson :

300 CLOSE#1
310 CLOSE#2

... ou simplement :

300 CLOSE

Le coin du programmeur

Les programmes C se trouvent dans le répertoire src/tocomm/ :

  • windows/toserial.c regroupe les primitives série pour Windows.
    • La fonction int SerialOpen(char *portname, int bauds, int datasize) ouvre le port série, où portname représente le nom du port série, bauds la vitesse choisie (de 1 à 8) et datasize la taille d'une donnée en bit (7 ou 8). La valeur retournée est TRUE si tout s'est bien passé, sinon FALSE.
    • La fonction char SerialRead(void) réceptionne un caractère. La valeur de retour est le caractère si tout s'est bien passé, 0 si aucun caractère n'a été reçu et -1 si une erreur est survenue.
    • La fonction int SerialWrite(char c) émet un caractère. La valeur de retour est 1 si tout s'est bien passé, 0 si aucun caractère n'a été émis et -1 si une erreur est survenue.
    • La fonction void SerialClose(void) ferme le port série.
  • linux/toserial.c regroupe les primitives série pour Linux. Mêmes caractéristiques que pour Windows ci-dessus.
  • tocomm.c regroupe les routines Basic.
    • La fonction int PrintLine_Basic(char *line) envoie une chaîne de caractères vers le Thomson. Retourne TRUE si tout s'est bien passé, sinon FALSE.
    • La fonction int PrintInt_Basic(int number) envoie une valeur numérique vers le Thomson. Retourne TRUE si tout s'est bien passé, sinon FALSE.
    • La fonction int InputLine_Basic(char *line) reçoit une chaîne de caractères ou une valeur numérique du Thomson. Retourne TRUE si tout s'est bien passé, sinon FALSE.
  • example.c est le programme d'exemple d'utilisation des routines.