找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4463|回复: 0
打印 上一主题 下一主题
收起左侧

51单片机超级终端 基于VT100协议 带proteus仿真及源码

[复制链接]
跳转到指定楼层
楼主
说明: 8051单片机超级终端, 基于VT100协议,提供完整源码,命令参数解析部分代码借鉴VIVI的源代码
            只添加了四条命令,help;prompt;clear;reboot;需要可以自己添加,比如内存查看命令等等
作者:蒋建军

仿真工程文件及所有完整程序等资料下载地址:
http://www.51hei.com/bbs/dpj-56304-1.html

部分单片机源程序:
  1. #include "HyperTerminal.h"

  2. /*****************************************************************************/
  3. char idata SerialBuffer[MAX_SERIAL_BUFFER_SIZE];
  4. char idata PromptBuffer[MAX_PROMPT_BUFFER_SIZE];
  5. char idata CursorPosion;
  6. char idata ExecCommandFlag;

  7. COMMAND CommandList[MAX_COMMAND_NUM] = {
  8.         {"help",Help," help -- Command help"},
  9.         {"prompt",Prompt," prompt <string> -- Change a prompt"},
  10.         {"clear",Clear," clear -- Clear screen"},
  11.         {"reboot",Reboot," reboot -- Reboot the MCU"}
  12. };

  13. /*****************************************************************************/
  14. void Help(char argc, const char **argv)
  15. {
  16.         char i;
  17.         argv = argv;
  18.         switch(argc)
  19.         {
  20.         case 1:
  21.                 for(i = 0; i < MAX_COMMAND_NUM; i++)
  22.                 {
  23.                         SerialSendStr(CommandList[i].HelpString);
  24.                         SerialSendStr("\r\n");
  25.                 }
  26.                 SerialSendStr("\r\n");
  27.                 break;
  28.         default:
  29.                 SerialSendStr(" Invalid 'help' command: too many arguments\r\n");
  30.                 SerialSendStr(" Usage:\r\n");
  31.                 SerialSendStr("     help\r\n");
  32.                 break;
  33.         }
  34. }

  35. void Prompt(char argc, const char **argv)
  36. {
  37.         switch(argc)
  38.         {
  39.         case 2:
  40.                 if(strlen(argv[1]) >= MAX_PROMPT_BUFFER_SIZE)
  41.                 {
  42.                         SerialSendStr(" Warnning:Your argument is too long!\r\n\r\n");
  43.                         break;
  44.                 }
  45.                 memcpy(PromptBuffer,argv[1],MAX_PROMPT_BUFFER_SIZE);
  46.                 SerialSendStr(" Prompt is chagned to \"");
  47.                 sprintf(&SerialBuffer[0],"%s\"\r\n\r\n",&PromptBuffer[0]);
  48.                 SerialSendStr(&SerialBuffer[0]);
  49.                 break;
  50.         default:
  51.                 SerialSendStr(" Invalid 'prompt' command: too few or many arguments\r\n");
  52.                 SerialSendStr(" Usage:\r\n");
  53.                 SerialSendStr("     prompt <string>\r\n");
  54.                 break;
  55.         }
  56. }

  57. void Clear(char argc, const char **argv)
  58. {
  59.         argv = argv;
  60.         switch(argc)
  61.         {
  62.         case 1:
  63.                 SerialSendStr(CLEARSCREEN);        
  64.                 break;
  65.         default:
  66.                 SerialSendStr(" Invalid 'clear' command: too many arguments\r\n");
  67.                 SerialSendStr(" Usage:\r\n");
  68.                 SerialSendStr("     clear\r\n");
  69.                 break;
  70.         }
  71. }

  72. void Reboot(char argc, const char **argv)
  73. {
  74.         argv = argv;
  75.         switch(argc)
  76.         {
  77.         case 1:
  78.                 (*(void(*)())0)();
  79.                 break;
  80.         default:
  81.                 SerialSendStr(" Invalid 'reboot' command: too many arguments\r\n");
  82.                 SerialSendStr(" Usage:\r\n");
  83.                 SerialSendStr("     reboot\r\n");
  84.                 break;
  85.         }
  86. }
  87. /*****************************************************************************/
  88. void InitHyperTerminal(void)
  89. {
  90.         TMOD |= 0x20;                 /* timer1, mode 2, 8 bit reload */
  91.         SCON  = 0x50;                 /* serial mode 1, 8 bit uart, enable receive  */
  92.         PCON  = 0x80;                 /* SMOD = 1, double baud */
  93.         TH1   = 0xFF;                /* baud = 57600, fosc = 11.0592MHZ */
  94.         TL1   = 0xFF;               
  95.         RI    = 0;                         /* clear receive flag */
  96.         TI    = 0;                        /* clear send flag */
  97.         TR1   = 1;                         /* start timer1 */
  98.         ES    = 1;                        /* enable serial interrupt */
  99.         EA    = 1;                        /* enable all interrupt */

  100.         CursorPosion = 0;
  101.         ExecCommandFlag = 0;
  102.         memset(&SerialBuffer[0],'\0',MAX_SERIAL_BUFFER_SIZE);
  103.         memcpy(&PromptBuffer[0],"-->>",MAX_PROMPT_BUFFER_SIZE);
  104.         SerialSendStr(F_LIGHTGREEN);
  105.         SerialSendStr(B_BLACK);
  106.         SerialSendStr(CLEARSCREEN);
  107.         SerialSendStr("-----------------------------\r\n");
  108.         SerialSendStr("  The 8051 Hyper Terminal,by JJJ\r\n");
  109.         SerialSendStr("  123456789 \r\n");
  110.         SerialSendStr("-----------------------------\r\n");
  111.         SerialSendStr("\r\n");
  112.         SerialSendStr(&PromptBuffer[0]);
  113. }

  114. void SerialSendByte(char dat)
  115. {
  116.         SBUF = dat;
  117.         while(TI == 0);
  118.         TI = 0;
  119. }

  120. void SerialSendStr(char *str)
  121. {
  122.         while(*str != '\0')
  123.         {
  124.                 SerialSendByte(*str);
  125.                 str++;
  126.         }
  127. }
  128.         
  129. void SerialInterrupt(void) interrupt 4 using 3
  130. {
  131.         char SbufTemp;
  132.         if(RI)
  133.         {
  134.                 RI = 0;
  135.                 SbufTemp = SBUF;
  136.                 switch(SbufTemp)
  137.                 {
  138.                 case 0x08:
  139.                 case 0x06:
  140.                 case 0x07:
  141.                 case 0x7E:
  142.                 case 0x7F:
  143.                         if(CursorPosion > 0)
  144.                         {
  145.                                 CursorPosion--;
  146.                                 SerialSendByte(0x08);
  147.                                 SerialSendByte(' ');
  148.                                 SerialSendByte(0x08);
  149.                         }
  150.                         SerialBuffer[CursorPosion] = '\0';
  151.                         break;
  152.                 case '\r':
  153.                 case '\n':
  154.                 case '\0':
  155.                         SerialSendByte('\r');
  156.                         SerialSendByte('\n');
  157.                         ExecCommandFlag = 1;
  158.                         break;
  159.                    case '\t':
  160.                         break;
  161.                 default:
  162.                         if(CursorPosion < MAX_SERIAL_BUFFER_SIZE)
  163.                         {
  164.                                 SerialBuffer[CursorPosion] = SbufTemp;
  165.                                 SerialSendByte(SbufTemp);
  166.                                 CursorPosion++;
  167.                         }
  168.                         else
  169.                         {
  170.                                 CursorPosion = 0;
  171.                                 memset(&SerialBuffer[0],'\0',MAX_SERIAL_BUFFER_SIZE);
  172.                                 SerialSendStr("\r\n Warnning:Your command string is too long!\r\n\r\n");
  173.                                 SerialSendStr(&PromptBuffer[0]);
  174.                         }
  175.                         break;
  176.                 }
  177.         }
  178. }

  179. void ParseArgs(char *argstr,char *argc_p,char **argv, char **resid)
  180. {
  181.         char argc = 0;
  182.         char c;
  183.         PARSESTATE stackedState,lastState = PS_WHITESPACE;

  184.         while ((c = *argstr) != 0)
  185.         {
  186.                 PARSESTATE newState;

  187.                 if (c == ';' && lastState != PS_STRING && lastState != PS_ESCAPE)
  188.                         break;

  189.                 if (lastState == PS_ESCAPE)
  190.                 {
  191.                         newState = stackedState;
  192.                 }
  193.                 else if (lastState == PS_STRING)
  194.                 {
  195.                         if (c == '"')
  196.                          {
  197.                                 newState = PS_WHITESPACE;
  198.                                 *argstr = 0;
  199.                         }
  200.                          else
  201.                         {
  202.                                 newState = PS_STRING;
  203.                         }
  204.                 }
  205.                  else if ((c == ' ') || (c == '\t'))
  206.                 {
  207.                         *argstr = 0;
  208.                         newState = PS_WHITESPACE;
  209.                 }
  210.                  else if (c == '"')
  211.                 {
  212.                         newState = PS_STRING;
  213.                         *argstr++ = 0;
  214.                         argv[argc++] = argstr;
  215.                 }
  216.                  else if (c == '\\')
  217.                 {
  218.                         stackedState = lastState;
  219.                         newState = PS_ESCAPE;
  220.                 }
  221.                  else
  222.                 {
  223.                         if (lastState == PS_WHITESPACE)
  224.                         {
  225.                                 argv[argc++] = argstr;
  226.                         }
  227.                         newState = PS_TOKEN;
  228.                 }

  229.                 lastState = newState;
  230.                 argstr++;
  231.         }

  232.         argv[argc] = NULL;
  233.         if (argc_p != NULL)
  234.                 *argc_p = argc;

  235.         if (*argstr == ';')
  236.         {
  237.                 *argstr++ = '\0';
  238.         }
  239.         *resid = argstr;
  240. }

  241. void ExecCommand(char *buf)
  242. {
  243.         char argc,*argv[8],*resid,i;
  244.         COMMAND *Command = 0;

  245.         while(*buf)
  246.          {
  247.                 memset(argv,0,sizeof(argv));
  248.                 ParseArgs(buf, &argc, argv, &resid);
  249.                 if(argc > 0)
  250.                 {
  251.                         for(i = 0; i < MAX_COMMAND_NUM; i++)
  252.                         {
  253.                                 Command = &CommandList[i];        
  254.                                 if(strncmp(Command->CommandName,argv[0],strlen(argv[0])) == 0)
  255.                                         break;
  256.                                 else
  257.                                         Command = 0;
  258.                         }
  259.                         if(Command == 0)
  260.                         {
  261.                                 SerialSendStr(" Could not found \"");
  262.                                 SerialSendStr(argv[0]);
  263.                                 SerialSendStr("\" command\r\n");
  264.                                 SerialSendStr(" If you want to konw available commands, type 'help'\r\n\r\n");
  265.                            }
  266.                         else
  267.                         {
  268.                                 Command->CommandFunc(argc,argv);
  269.                         }
  270.                 }
  271.                 buf = resid;
  272.         }
  273. }

  274. void RunHyperTerminal(void)
  275. {
  276.         if(ExecCommandFlag)
  277.         {
  278.                 ExecCommand(&SerialBuffer[0]);
  279.                 SerialSendStr(&PromptBuffer[0]);
  280.                 memset(&SerialBuffer[0],'\0',MAX_SERIAL_BUFFER_SIZE);
  281.                 CursorPosion = 0;
  282.                 ExecCommandFlag = 0;
  283.         }
  284. }
复制代码



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表