Serveur d'impression

Serveur Telnet Arduino · GitHub – Serveur d’impression

Le 20 avril 2020 - 8 minutes de lecture

/ * * * Serveur Arduino Telnet * * 7 juillet 2010 * * E / S Arduino de base via * * une interface de ligne de commande * * par Steve Lentz * * stlentz[at]Gmail[dot]com * Instructions de démarrage rapide: 1) Définissez l'adresse Ethernet dans le code ci-dessous. 2) Compilez et téléchargez le croquis. 3) Connectez Arduino à Ethernet. Assurez-vous que le voyant de liaison est allumé. 4) Telnet à l'adresse IP d'Arduino. 5) Sur certains clients Telnet, appuyez sur Retour pour réactiver la connexion. 6) Une fois connecté, tapez? pour aider. 7) Essayez une commande simple telle que «ar». Autres notes Testé sur Duemilanove avec Ethernet Shield. Devrait fonctionner sur des cartes compatibles. Testé avec les clients Win XP, OS X et Debian Telnet. Compile à environ 9 Ko, peut être réduit en supprimant commandes inutiles, message d'aide, etc. Je suis un programmeur C entièrement autodidacte; si tu n'aime pas mon code, tant pis ;-). * / http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1278686415 // Paramètres Ethernet #comprendre <SPI.h> #comprendre <Ethernet.h> octet Mac[] = 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED ; octet ip[] = 192, 168, 1, 7 ; octet passerelle[] = 192, 168, 1, 1 ; octet sous-réseau[] = 255, 255, 255, 0 ; // Autres variables globales #define textBuffSize 9 //longueur de la chaîne de commande la plus longue plus deux espaces pour CR + LF carboniser textBuff[textBuffSize]; //un endroit pour mettre le texte reçu int charsReceived = 0; booléen connectFlag = 0; //nous utiliserons un indicateur distinct de client.connected //afin que nous puissions reconnaître quand une nouvelle connexion a été créée non signé longue timeOfLastActivity; //temps en millisecondes de la dernière activité non signé longue allowedConnectTime = 300000; //cinq minutes EthernetServer serveur(23); // Telnet écoute sur le port 23 EthernetClient client = 0; // Le client doit avoir une portée globale pour pouvoir être appelé // des fonctions en dehors de la boucle, mais nous ne savons pas // quel client est encore, donc créer un objet vide néant installer() // définition des broches 0 à 9 comme sorties // les broches 10-13 sont utilisées par le blindage Ethernet pour(int je= 0; je < dix; je++) pinMode (i, PRODUCTION); Ethernet.commencer (mac, ip, passerelle, sous-réseau); serveur.commencer(); néant boucle() // regardez si une nouvelle connexion est créée, // imprimer le message de bienvenue, définir le drapeau connecté si (serveur.disponible() && !connectFlag) connectFlag = 1; client = serveur.disponible(); client.println (" nServeur Arduino Telnet de Steve"); client.println ("? pour aider"); printPrompt (); // vérifier si le texte reçu si (client.lié() && client.available ()) getReceivedText (); // vérifiez si la connexion a expiré si(connectFlag) checkConnectionTimeout (); // code pour faire d'autres choses en boucle irait ici néant printPrompt () timeOfLastActivity = millis(); client.affleurer(); charsReceived = 0; //nombre de caractères reçus client.impression(" n>"); néant checkConnectionTimeout () si(millis() timeOfLastActivity > allowedConnectTime) client.println (); client.println ("Déconnexion de temporisation."); client.Arrêtez(); connectFlag = 0; néant getReceivedText () carboniser c; int attente; // copier les caractères en attente dans textBuff //jusqu'à ce que textBuff soit complet, que CR ait reçu ou plus de caractères caractères = client.disponible(); faire c = client.lis(); textBuff[charsReceived] = c; charsReceived++; caractères; tandis que(charsReceived <= textBuffSize && c ! = 0x0d && caractères > 0); //si CR trouvé, regardez le texte reçu et exécutez la commande si(c == 0x0d) parseReceivedText (); // après avoir terminé la commande, imprimez une nouvelle invite printPrompt (); // si textBuff plein sans atteindre un CR, imprimer un message d'erreur si(charsReceived > = textBuffSize) client.println (); printErrorMessage (); printPrompt (); // si textBuff n'est pas plein et pas de CR, ne faites rien d'autre; // revenir en boucle jusqu'à ce que plus de caractères soient reçus néant parseReceivedText () // regardez le premier caractère et décidez quoi faire commutateur (textBuff[[0]) Cas "une" : doAnalogCommand (); Pause; Cas "" : doDigitalCommand (); Pause; Cas "p" : setPinMode (); Pause; Cas "c" : checkCloseConnection (); Pause; Cas "?" : printHelpMessage (); Pause; Cas 0x0d : Pause; //ignorer un retour chariot défaut: printErrorMessage (); Pause; néant doDigitalCommand () // si nous sommes arrivés ici, textBuff[0] = 'd' commutateur (textBuff[[1]) Cas "r" : readDigitalPins (); Pause; Cas "w" : writeDigitalPin (); Pause; défaut: printErrorMessage (); Pause; néant readDigitalPins () // si nous sommes arrivés ici, textBuff[0] = 'd' et textBuff[1] = 'r' int épingle; si (textBuff[[2] == 0x0d) // sortie la valeur de chaque broche numérique pour (int je = 0; je < dix; je++) outputPinState (i); autre épingle = parseDigit (textBuff[[2]); si(épingle > =0 && épingle <=9) outputPinState (broche); autre printErrorMessage (); néant outputPinState (int épingle) client.impression("broche numérique "); client.impression (épingle); client.impression(" est "); si (digitalRead (pin)) client.println ("HAUTE"); autre client.println ("FAIBLE"); néant writeDigitalPin () // si nous sommes arrivés ici, textBuff[0] = 'd' et textBuff[1] = 'w' int épingle = 1; int pinSetting = 1; si (textBuff[[3] == "=" && textBuff[[6] == 0x0d) pinSetting < 0) printErrorMessage (); autre printErrorMessage (); int parsePinSetting () //regardez dans le tampon de texte pour trouver le réglage de la broche //renvoie -1 si non valide int pinSetting = 1; si(textBuff[[4] == "l" && textBuff[[5] == "o") pinSetting = 0; si(textBuff[[4] == "h" && textBuff[[5] == "je") pinSetting = 1; revenir pinSetting; néant doAnalogCommand () // si nous sommes arrivés ici, textBuff[0] = 'a' commutateur (textBuff[[1]) Cas "r" : readAnalogPins (); Pause; Cas "w" : writeAnalogPin (); Pause; défaut: printErrorMessage (); Pause; néant readAnalogPins () // si nous sommes arrivés ici, textBuff[0] = 'a' et textBuff[1] = 'r' // check textBuff[2] est un CR alors // sortie la valeur de chaque broche d'entrée analogique si(textBuff[[2] == 0x0d) pour (int je = 0; je < 6; je++) client.impression("entrée analogique "); client.imprimer (i); client.impression(" est "); client.println (analogRead (i)); autre printErrorMessage (); néant writeAnalogPin () // si nous sommes arrivés ici, textBuff[0] = 'a' et textBuff[1] = 'w' int épingle = 1; int pwmSetting = 1; si (textBuff[[3] == "=") autre printErrorMessage (); int parsepwmSetting () int pwmSetting = 0; int textPosition = 4; //commencer à textBuff[4] int chiffre; faire chiffre = parseDigit (textBuff[textPosition]); //rechercher un chiffre dans textBuff si (chiffre > = 0 && chiffre <=9) //si chiffre trouvé pwmSetting = pwmSetting * dix + chiffre; //décaler le résultat précédent et ajouter un nouveau chiffre autre pwmSetting = 1; textPosition++; //aller à la position suivante dans textBuff //sinon à la fin de textBuff et pas trouvé de CR et pas eu d'erreur, continuez tandis que(textPosition < 7 && textBuff[textPosition] ! = 0x0d && pwmSetting > 1); //si la valeur n'est pas suivie d'un CR, retourne une erreur si(textBuff[textPosition] ! = 0x0d) pwmSetting = 1; revenir pwmSetting; néant setPinMode () // si nous sommes arrivés ici, textBuff[0] = 'p' int épingle = 1; int pinModeSetting = 1; si (textBuff[[1] == "m" && textBuff[[3] == "=" && textBuff[[6] == 0x0d) //si oui, obtenez le numéro de broche, le réglage et définissez la broche épingle = parseDigit (textBuff[[2]); pinModeSetting = parseModeSetting (); si(épingle > 1 && pinModeSetting == 0) pinMode (broche, PRODUCTION); client.println ("D'accord"); si(épingle > 1 && pinModeSetting == 1) pinMode (broche, CONTRIBUTION); client.println ("D'accord"); si(épingle < 0 autre printErrorMessage (); int parseModeSetting () //regardez dans le tampon de texte pour trouver le réglage de la broche //renvoie -1 si non valide int pinSetting = 1; si(textBuff[[4] == "o" && textBuff[[5] == "u") pinSetting = 0; si(textBuff[[4] == "je" && textBuff[[5] == "n") pinSetting = 1; revenir pinSetting; int parseDigit (carboniser c) int chiffre = 1; chiffre = (int) c 0x30; // soustraire 0x30 du code ASCII donne une valeur si(chiffre < 0 néant printErrorMessage () client.println ("Commande non reconnue. ? pour aider."); néant checkCloseConnection () // si nous sommes arrivés ici, textBuff[0] = 'c', vérifiez les deux suivants // caractères pour vous assurer que la commande est valide si (textBuff[[1] == "l" && textBuff[[2] == 0x0d) fermer la connexion(); autre printErrorMessage (); néant fermer la connexion() client.println (" nAu revoir. n"); client.Arrêtez(); connectFlag = 0; néant printHelpMessage () client.println (" nExemples de commandes prises en charge: n"); client.println (" dr-lecture numérique: renvoie l'état des broches numériques 0 à 9"); client.println (" dr4 – lecture numérique: retourne uniquement l'état de la broche 4"); client.println (" ar -analog read: retourne toutes les entrées analogiques"); client.println (" dw0 = hi-écriture numérique: activer la broche 0 sur les broches valides sont de 0 à 9"); client.println (" dw0 = lo – écriture numérique: désactivez la broche 0, les broches valides sont comprises entre 0 et 9"); client.println (" aw3 = 222 – écriture analogique: définir la broche numérique 3 sur la valeur PWM 222"); client.println (" les broches autorisées sont 3,5,6,9"); client.println (" plage PWM autorisée 0 à 255"); client.println (" pm0 = en mode pin: définissez la broche 0 sur INPUT les broches valides sont de 0 à 9"); client.println (" pm0 = ou -pin mode: définissez la broche 0 sur OUTPUT les broches valides sont de 0 à 9"); client.println (" cl -close connexion"); client.println (" ? -imprimer ce message d'aide");

Commentaires

Laisser un commentaire

Votre commentaire sera révisé par les administrateurs si besoin.