Je cherche quelques conseils pour coder un server minitel local.
Je n’ai pas tout compris et je bidouille beaucoup, ne m’en voulez pas si mélange les concepts…
setup : Un minitel 1B relié via un cable DIN 5 a mon mac.
Je code un programme en C++, sorte de server, qui fait la communication entre mon minitel et mon mac. Je recupere les inputs du minitel (avec la fonction poll()) afin de renvoyer des commandes videotex suivant les inputs.
Je n’ai pas tout a fais saisie le protocole PR01 PR02 (voir pas du tout)… me sont ils nécessaire ? Quel sont les syntaxes exacts de ces commandes ? Y a t’il un moyen pour demander au minitel son mode actuel (videotex 40 / ascii 80) ? Je cherche également une sequence d’initialisation, qui me permettrait de vider le buffer, et de remettre le minitel dans un état ‘propre’.
Pour le moment j’envoie des commandes basique (clear screen, position curseur, etc … ) qui fonctionnent plutot bien.
Certaines commandes ne semble pas fonctionner, envoyé depuis mon ordi (ex: mode rouleau) et je dois le faire via les touches Fnct E + R. (j’aimerai beaucoup pouvoir commander ces fonctions depuis le mac).
Y a t il une procédure particulière pour se déconnecter ? Il apparait que le minitel ne reçois plus les commandes correctement a certains moment (les commandes affichent un caractère blanc ‘block’, au lieu de leurs fonctionnalités). J’arrive ensuite à reprendre une communication normal apres plusieurs connexion/déconnexion, mais pas toujours.
Les codes (et beaucoup plus encore) sont expliqués dans le document STUM1B (ici sous forme digitalisée) :
Il existe également un fichier PDF contenant la liste des principaux codes (cherche « Résumé des principaux codes vidéotex (auteur inconnu) » sur https://www.minipavi.fr/).
Les PROx (x=1,2,3) sont simplement des préfixes qui introduisent de longues séquences de longueur X. Si tu parles de ceux nécessaires pour désactiver l’écho, l’explication se trouve dans la section 2.1.1.2 (lien ici). Quand le Minitel s’allume, il est en « état local », ce qui implique les connexions internes représentées dans l’image du lien, qui font que ce que tu tapes apparaît à l’écran. Grâce aux commandes PRO3, tu peux les modifier et les mettre dans un état où seul ce qui arrive par le cable DIN 5 (« prise péri-informatique ») est affiché.
Je n’en connais pas, mais tu peux essayer d’envoyer toutes les commandes de changement d’état dont tu as besoin les unes après les autres. Au final, l’état final sera celui que tu souhaites.
C’est le caractère de remplacement pour les données non valides. Est-ce que tu modifies le baud rate ? Peut-être que l’ordinateur et le Minitel ne sont plus synchronisés sur le baud rate.
Notamment, P_ACK_OFF_PRISE permet de supprimer les acknoledges sur la prise péri-info, ce qui évite au programme sur le PC/Mac d’avoir à filtrer certaines séquences de réponse engendrées par des requêtes provenant elles-mêmes de la prise (Je m’aperçois que je ne suis pas très compréhensible ici).
Merci pour vos reponses !! Je vais fouiller un peu.
Assumant que le minitel démarre en 1200bauds (Je n’envois aucunes commandes via le clavier minitel au demarrage, en utilisant le mode videotex 40 colonnes), je fais un open comme ceci:
Vos réponses m’aident beaucoup merci ! Une fois que le server seras fonctionnelle, je m’attaquerai a la prise telephonique, ou bien au micro controller ! Je vous tiendrais au jus
Le Minitel n’a pas de raison de changer vitesse, ni (en principe) ton réglage de port série depuis ton code.
Pourrais-tu partager une photo de ces blocs blancs ? C’est effectivement ce qui s’affiche en cas de transmission incorrecte, ça peut donc aussi venir d’un problème électronique… et donc du câble USB/Minitel.
D’où vient ce câble, comment est-il conçu ?
Il faut déjà vérifier ça, avoir une transmission stable pour ensuite coder des trucs en confiance avec les couches plus basses.
Autre possibilité, un défaut du Minitel… surchauffe ou instabilité de l’alim, etc. Ils ont quand même 40 ans !
Ils apparaissent a l’ouverture du programe (en envoyant n’importe quel commandes).
Si je quitte le server (en faisant un close(serial_port_)) Parfois le symptome disparrait, et je peux de nouveau communiquer avec le minitel normalement en relançant le programe.
Est ce que cela pourrait etre du au bit de parité ? Ce minitel m’as ete donné, encore dans son emballage d’origine (avec les cables rangé et ficellé, comme neuf !). J’espere qu il est encore viable… ?
Bonsoir IIlia, pour ne pas te prendre la tête à fabriquer un câble, je te conseille le vendeur R-ECommerce sur eBay qui en vend à un tarif très raisonnable. On le trouve rapidement avec la recherche “câble Minitel”. Je lui ai personnellement acheté deux câbles USB→DIN FT232RL et un câble série DB9→DIN comme à l’époque !
Le vendeur est très sympathique et te renseignera rapidement en cas de doute.
J’ai exactement le même adaptateur USB, connecté directement aux broches DIN sans aucun circuit intermédiaire, et il fonctionne.
Je pense que tu as un autre programme qui modifie la vitesse de transmission (côté Linux) pendant que ton programme est en cours d’exécution. C’est pourquoi, si tu le relances (en réglant à nouveau la vitesse de transmission), il fonctionne à nouveau. Je tenterais de désinstaller ModemManager (qui, dans le passé, a parfois interféré avec mes ports série car il essaie de déterminer si un modem AT est connecté).
Tes symptômes affichés au dessus sont typiques d’un port série mal configuré à l’ouverture ou bien une vitesse non identique sur PC et Minitel. Si tu changes de débit par logiciel, le Minitel peut rester, à la relance, avec une vitesse différente du PC d’où les lignes blanches. Tu peux essayer de forcer le Minitel à 1200 Bds avec FNCT-P 1 pour repasser en 1200 avant de lancer ton soft pour voir si ça fonctionne mieux.
Pour info :
FNCT-P 1 = 1200 Bds
FNCT-P 4 = 4800 Bds
FNCT-P 9 = 9600 Bds
Concernant les acquittements Minitel, il te faudra une fonction de filtrage des réponses à certains protocoles pour éviter d’afficher ces caractères sur le terminal.
Voilà un exemple de code C simplifié de gestion d’un caractère qui arrive d’un Minitel. Le filtrage des réponses de protocole est présent, si ça peut aider :
switch( instate ){
case 0 : // Chr normal
if ( chr == FNCT_MNTL ){ // Est-ce une touche de fonction Minitel ?
send(server_sock,&buf,1,0); // oui, envoi le chr au serveur
instate = 1;
break;
}
if ( chr == 0x1b ){ // Filtrage ESC PRO1, PRO2, PRO3
instate = 2;
break;
}
if ( chr == 0x1 ){
instate = 6; // ENQ ROM
break;
}
serial_write_char(fdserial, chr); // Echo sur le Minitel
send(server_sock,&buf,1,0); // Envoi le chr au serveur
break;
case 1 : // Seconde touche de fonction Minitel
// Traitement selon touche de fonction...
send(server_sock,&buf,1,0); // Envoi le chr au serveur
instate=0;
break;
case 2 : // Filtrage SEQ ESC
if ( chr == '9' ){ // PRO1
instate = 5;
break;
}
if ( chr == ':' ){ // PRO2
instate = 4;
break;
}
if ( chr == ';' ) // PRO3
instate = 3;
else
instate = 0;
break;
case 3 : // 3chr Filtrage SEQ ESC
instate = 4;
break;
case 4 : // 2chr Filtrage SEQ ESC
instate = 5;
break;
case 5 : // 1chr Filtrage SEQ ESC
instate = 0;
break;
case 6 : // Réponse à ENQ ROM : modèle du Minitel - chr1
minitelModel[0]=chr;
minitelModel[1]='\0';
instate = 7;
break;
case 7 : // ENQ ROM chr2
minitelModel[1]=chr;
minitelModel[2]='\0';
instate = 8;
break;
case 8 : // ENQ ROM chr3 filtrage de la version du firmware
instate = 9;
break;
case 9 : // Fin ENQ ROM
printf(" Model : %s", minitelModel);
instate = 0;
break;
} // Fin switch
Clairement un problème de vitesse et/ou parité… ou de transmission incorrecte / instable.
Si c’est toujours le même code qui tourne qui fonctionne parfois normalement, je ne mettrai pas prioritairement ce code en doute, mais la liaison USB-Minitel car elle me semble moins stable que le code
Sur cette liaison, je ne vois aucune résistance… pourtant nécessaire pour la communication dans le sens Minitel > USB (220k entre le 5V qui sort du Minitel et le RX (en général ce sont les fils rouge et vert).
Info potentiellement utile. Sur Mac je ne sais pas comment faire, mais sous Linux, pour que la communication fonctionne, j’ai toujours utilisé cette commande pour configurer la vitesse, parité, etc. :