{"id":4812,"date":"2026-11-02T22:25:50","date_gmt":"2026-11-02T21:25:50","guid":{"rendered":"https:\/\/sophie-matthieu.eu\/?p=4812"},"modified":"2026-11-03T07:11:39","modified_gmt":"2026-11-03T06:11:39","slug":"faire-parler-un-sharp-pc-g850vs-a-linux-interface-arduino-leonardo-et-application-c-avalonia","status":"publish","type":"post","link":"https:\/\/sophie-matthieu.eu\/index.php\/2026\/11\/02\/faire-parler-un-sharp-pc-g850vs-a-linux-interface-arduino-leonardo-et-application-c-avalonia\/","title":{"rendered":"Faire parler un Sharp PC-G850VS \u00e0 Linux : interface Arduino Leonardo et application C#\/Avalonia"},"content":{"rendered":"<p><!-- Article WordPress : PC-G850VS + Arduino Leonardo + appli C#\/Avalonia --><\/p>\n<p>Le <strong>Sharp PC-G850VS<\/strong> est un \u00ab pocket computer \u00bb du milieu des ann\u00e9es 1990 : un petit ordinateur de poche programmable en <strong>BASIC<\/strong>, en <strong>assembleur Z80<\/strong> et m\u00eame en <strong>C<\/strong>, avec un afficheur de 24&nbsp;caract\u00e8res et un connecteur s\u00e9rie 11&nbsp;broches. Trente ans plus tard, l&rsquo;envie reste la m\u00eame : \u00e9crire un programme confortablement sur un PC moderne, puis l&rsquo;<strong>envoyer<\/strong> dans le pocket \u2014 et r\u00e9cup\u00e9rer ceux qu&rsquo;on tape dessus. Voici comment je l&rsquo;ai fait, d&rsquo;abord <strong>en ligne de commande<\/strong>, puis avec une petite <strong>application de bureau en C#\/Avalonia<\/strong>.<\/p>\n<h2>Le probl\u00e8me : un port s\u00e9rie \u00ab \u00e0 l&rsquo;envers \u00bb en 5&nbsp;V<\/h2>\n<p>Le connecteur du G850 n&rsquo;est pas un port s\u00e9rie standard. Il travaille en <strong>logique TTL invers\u00e9e<\/strong> (le repos est \u00e0 l&rsquo;\u00e9tat bas) et en <strong>5&nbsp;V<\/strong>. Impossible de le brancher tel quel sur un adaptateur USB\u2011s\u00e9rie classique sans inverser les signaux. Plut\u00f4t qu&rsquo;un FT232 configur\u00e9 via FTProg, j&rsquo;ai choisi un pont tr\u00e8s simple \u00e0 reproduire : une <strong>carte Arduino Leonardo<\/strong>.<\/p>\n<p>Pourquoi la Leonardo&nbsp;? Parce que son microcontr\u00f4leur (ATmega32U4) g\u00e8re l&rsquo;<strong>USB nativement<\/strong> (port CDC, vu comme <code>\/dev\/ttyACM0<\/code> sous Linux), et parce qu&rsquo;elle est en <strong>5&nbsp;V<\/strong>, exactement comme le G850 \u2014 pas de diviseur de tension n\u00e9cessaire. Un sketch minimaliste bas\u00e9 sur <code>SoftwareSerial<\/code> se charge de l&rsquo;inversion de logique.<\/p>\n<h2>Le c\u00e2blage<\/h2>\n<p>Trois fils de donn\u00e9es suffisent, plus un petit pontage pour le contr\u00f4le de flux&nbsp;:<\/p>\n<figure class=\"wp-block-table\">\n<table style=\"border-collapse:collapse;width:100%;max-width:700px;margin:0 auto;font-size:15px;line-height:1.5\">\n<thead>\n<tr>\n<th style=\"border:1px solid #cbd5e1;padding:10px 16px;background:#1f4e79;color:#ffffff;text-align:left\">Broche du G850 (connecteur 11&nbsp;points)<\/th>\n<th style=\"border:1px solid #cbd5e1;padding:10px 16px;background:#1f4e79;color:#ffffff;text-align:left\">Arduino Leonardo<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"border:1px solid #cbd5e1;padding:10px 16px\">broche&nbsp;7 \u2014 TXD <em>(sortie du G850)<\/em><\/td>\n<td style=\"border:1px solid #cbd5e1;padding:10px 16px\">D8 <em>(RX logiciel)<\/em><\/td>\n<\/tr>\n<tr style=\"background:#f5f8fc\">\n<td style=\"border:1px solid #cbd5e1;padding:10px 16px\">broche&nbsp;6 \u2014 RXD <em>(entr\u00e9e du G850)<\/em><\/td>\n<td style=\"border:1px solid #cbd5e1;padding:10px 16px\">D9 <em>(TX logiciel)<\/em><\/td>\n<\/tr>\n<tr>\n<td style=\"border:1px solid #cbd5e1;padding:10px 16px\">broche&nbsp;3 \u2014 GND<\/td>\n<td style=\"border:1px solid #cbd5e1;padding:10px 16px\">GND<\/td>\n<\/tr>\n<tr style=\"background:#f5f8fc\">\n<td style=\"border:1px solid #cbd5e1;padding:10px 16px\">broches&nbsp;4 + 9 \u2014 RTS\/CTS <em>(pont\u00e9es ensemble)<\/em><\/td>\n<td style=\"border:1px solid #cbd5e1;padding:10px 16px\">+5&nbsp;V via r\u00e9sistance 10&nbsp;k\u03a9 <em>(pull-up)<\/em><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>Enfin, les broches <strong>4 (RTS)<\/strong> et <strong>9 (CTS)<\/strong> du G850 sont reli\u00e9es entre elles et tir\u00e9es au <strong>+5&nbsp;V via une r\u00e9sistance de 10&nbsp;k\u03a9<\/strong> (n&rsquo;importe quelle valeur entre 4,7&nbsp;k\u03a9 et 47&nbsp;k\u03a9 convient). Sans ce pontage, le Sharp attend ind\u00e9finiment un \u00ab pr\u00eat \u00e0 recevoir \u00bb qui ne vient jamais.<\/p>\n<p>C\u00f4t\u00e9 pocket, pas de connecteur propri\u00e9taire \u00e0 d\u00e9nicher&nbsp;: on <strong>soude les fils sur une barrette s\u00e9cable de 11&nbsp;broches au pas 2,54&nbsp;mm<\/strong> (coup\u00e9e \u00e0 11&nbsp;contacts), qui s&rsquo;enfiche directement dans le port du G850. On y c\u00e2ble <strong>RX, TX, GND et le pont RTS\/CTS<\/strong>, la <strong>r\u00e9sistance de pull\u2011up<\/strong> du pont \u00e9tant ramen\u00e9e au <strong>+5&nbsp;V (VCC)<\/strong> de l&rsquo;Arduino Leonardo. L&rsquo;ensemble se r\u00e9alise en quelques points de soudure.<\/p>\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/sophie-matthieu.eu\/wp-content\/uploads\/2026\/11\/schema-cablage-g850.png\" alt=\"Sch\u00e9ma de c\u00e2blage Sharp PC-G850 vers Arduino Leonardo\"\/><figcaption>C\u00e2blage&nbsp;: broches 7&#8594;D8, 6&#8594;D9, 3&#8594;GND, et pont RTS\/CTS (4+9) avec r\u00e9sistance de pull-up 10&nbsp;k&#8486; vers le +5&nbsp;V de la Leonardo.<\/figcaption><\/figure>\n<p>C\u00f4t\u00e9 firmware, tout tient en quelques lignes \u2014 la cl\u00e9 est le troisi\u00e8me param\u00e8tre <code>true<\/code> qui active la logique invers\u00e9e&nbsp;:<\/p>\n<pre><code>#include &lt;SoftwareSerial.h&gt;\n#define RX_PIN 8   \/\/ &lt;- broche 7 du G850 (TXD)\n#define TX_PIN 9   \/\/ -&gt; broche 6 du G850 (RXD)\n\nSoftwareSerial G850Serial(RX_PIN, TX_PIN, true); \/\/ inverse_logic = true\n\nvoid setup() {\n  Serial.begin(9600);       \/\/ port USB vers le PC\n  G850Serial.begin(9600);   \/\/ port invers\u00e9 vers le G850\n}\n\nvoid loop() {\n  if (Serial.available())     G850Serial.write(Serial.read());   \/\/ PC -&gt; G850\n  if (G850Serial.available()) Serial.write(G850Serial.read());   \/\/ G850 -&gt; PC\n}<\/code><\/pre>\n<p>La liaison est en <strong>9600 bauds, 8N1<\/strong>. La LED de la carte clignote \u00e0 chaque octet qui transite : un indicateur bien pratique.<\/p>\n<h2>Premier test : en ligne de commande<\/h2>\n<p>Avant d&rsquo;\u00e9crire la moindre interface, on valide le lien avec deux commandes Linux. On r\u00e8gle le port, puis on envoie un fichier&nbsp;:<\/p>\n<pre><code>stty -F \/dev\/ttyACM0 9600 cs8 -cstopb -parenb raw -echo\ncat mon_programme.bas &gt; \/dev\/ttyACM0<\/code><\/pre>\n<p>Et pour <strong>recevoir<\/strong> un programme que l&rsquo;on sauvegarde depuis le Sharp&nbsp;:<\/p>\n<pre><code>cat \/dev\/ttyACM0 &gt; capture.txt<\/code><\/pre>\n<p>Un d\u00e9tail compte&nbsp;: le G850 attend des fins de ligne en <strong>retour chariot seul (CR)<\/strong>, l\u00e0 o\u00f9 Linux utilise un saut de ligne (LF). Un simple <code>tr '\\n' '\\r'<\/code> fait la conversion avant l&rsquo;envoi.<\/p>\n<p>C\u00f4t\u00e9 pocket, le transfert passe par l&rsquo;<strong>\u00e9diteur de texte<\/strong> int\u00e9gr\u00e9, qui est une m\u00e9moire distincte de la m\u00e9moire BASIC. La man\u0153uvre compl\u00e8te pour charger et ex\u00e9cuter un programme&nbsp;:<\/p>\n<ol>\n<li>Sur le G850 : mode <strong>TEXT<\/strong>, \u00e9diteur vide, menu <strong>SIO \u2192 Load<\/strong> (il attend).<\/li>\n<li>Sur le PC : la commande <code>cat \u2026 &gt; \/dev\/ttyACM0<\/code>. Le texte se remplit dans l&rsquo;\u00e9diteur.<\/li>\n<li>Mode <strong>BASIC<\/strong> : <code>NEW<\/code> pour <strong>vider<\/strong> la m\u00e9moire BASIC de l&rsquo;ancien programme.<\/li>\n<li>Retour \u00e0 l&rsquo;\u00e9diteur, menu <strong>basic \u2192 \u00ab Basic \u2190 text \u00bb<\/strong> : le texte est <strong>alors<\/strong> converti en programme BASIC.<\/li>\n<li>Mode <strong>BASIC<\/strong> : <code>RUN<\/code>.<\/li>\n<\/ol>\n<p><strong>L&rsquo;ordre compte&nbsp;:<\/strong> on fait <code>NEW<\/code> <em>avant<\/em> la conversion. En effet, \u00ab Basic&nbsp;\u2190&nbsp;text \u00bb ne remplace pas la m\u00e9moire BASIC&nbsp;: il la <strong>fusionne<\/strong> ligne \u00e0 ligne. Si on convertit sans avoir vid\u00e9 au pr\u00e9alable, le nouveau programme vient se <strong>superposer<\/strong> \u00e0 l&rsquo;ancien et les deux se m\u00e9langent.<\/p>\n<p>Au premier <code>RUN<\/code> r\u00e9ussi \u2014 un petit programme qui demande un nom, compte jusqu&rsquo;\u00e0 cinq et fait biper le buzzer \u2014 on sait que toute la cha\u00eene fonctionne, dans les deux sens.<\/p>\n<h2>L&rsquo;\u00e9tape confortable : une appli C#\/Avalonia<\/h2>\n<p>Taper des commandes <code>stty<\/code> et <code>cat<\/code> \u00e0 chaque transfert, convertir les fins de ligne \u00e0 la main\u2026 \u00e7a va cinq minutes. J&rsquo;ai donc d\u00e9velopp\u00e9 un petit <strong>Sharp PC Connectivity Kit<\/strong> en <strong>C# avec Avalonia<\/strong> (le framework d&rsquo;interface multiplateforme de .NET), qui tourne aussi bien sous <strong>Linux que Windows<\/strong>.<\/p>\n<p>Ses fonctions&nbsp;:<\/p>\n<ul>\n<li>d\u00e9tection des ports s\u00e9rie, connexion en un clic (9600&nbsp;8N1)&nbsp;;<\/li>\n<li>un <strong>\u00e9diteur<\/strong> central avec une <strong>biblioth\u00e8que<\/strong> rang\u00e9e par langage (BASIC, C, assembleur Z80, texte)&nbsp;;<\/li>\n<li><strong>Envoyer \u2191<\/strong> \/ <strong>Recevoir \u2193<\/strong> vers et depuis le G850&nbsp;;<\/li>\n<li>surtout, la <strong>conversion des fins de ligne automatique<\/strong> : LF \u00e0 l&rsquo;\u00e9cran et sur le disque, CR sur le c\u00e2ble. Fini les fichiers \u00ab _cr \u00bb en double \u2014 un seul fichier par programme sert aux deux sens.<\/li>\n<\/ul>\n<p>Techniquement, l&rsquo;application s&rsquo;appuie sur <code>System.IO.Ports<\/code> pour le port s\u00e9rie, encode les octets en <code>Latin1<\/code> (correspondance 1:1 octet\/caract\u00e8re), et envoie par blocs de 64&nbsp;octets avec une petite pause pour ne pas saturer le pocket. La normalisation des fins de ligne g\u00e8re m\u00eame le cas d&rsquo;un CR\/LF coup\u00e9 entre deux paquets s\u00e9rie.<\/p>\n<h2>Et ensuite&nbsp;?<\/h2>\n<p>Le pont Arduino est parfait pour prototyper, mais l&rsquo;\u00e9tape suivante est un petit <strong>circuit imprim\u00e9 d\u00e9di\u00e9<\/strong> (USB\u2011C + inverseur mat\u00e9riel) pour se passer de la carte Leonardo et obtenir un adaptateur compact. En attendant, n&rsquo;importe qui poss\u00e9dant un Sharp PC\u2011G850 et une Arduino Leonardo peut reproduire ce montage en une soir\u00e9e \u2014 et redonner vie aux programmes de sa jeunesse.<\/p>\n<p><em>Montage et logiciel test\u00e9s sous Ubuntu&nbsp;; le code de l&rsquo;application est en C#\/.NET&nbsp;8 avec Avalonia.<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Le Sharp PC-G850VS est un \u00ab pocket computer \u00bb du milieu des ann\u00e9es 1990 : un petit ordinateur de poche programmable en BASIC, en assembleur Z80 et m\u00eame en C, avec un afficheur de 24&nbsp;caract\u00e8res et un connecteur s\u00e9rie 11&nbsp;broches. Trente ans plus tard, l&rsquo;envie reste la m\u00eame : \u00e9crire un programme confortablement sur un [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[34],"tags":[],"class_list":["post-4812","post","type-post","status-publish","format-standard","hentry","category-maker"],"_links":{"self":[{"href":"https:\/\/sophie-matthieu.eu\/index.php\/wp-json\/wp\/v2\/posts\/4812","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sophie-matthieu.eu\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sophie-matthieu.eu\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sophie-matthieu.eu\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/sophie-matthieu.eu\/index.php\/wp-json\/wp\/v2\/comments?post=4812"}],"version-history":[{"count":9,"href":"https:\/\/sophie-matthieu.eu\/index.php\/wp-json\/wp\/v2\/posts\/4812\/revisions"}],"predecessor-version":[{"id":4826,"href":"https:\/\/sophie-matthieu.eu\/index.php\/wp-json\/wp\/v2\/posts\/4812\/revisions\/4826"}],"wp:attachment":[{"href":"https:\/\/sophie-matthieu.eu\/index.php\/wp-json\/wp\/v2\/media?parent=4812"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sophie-matthieu.eu\/index.php\/wp-json\/wp\/v2\/categories?post=4812"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sophie-matthieu.eu\/index.php\/wp-json\/wp\/v2\/tags?post=4812"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}