PC与开发板通信:一个简单的shell实现[部分代码]

View Code
  1 void main()
  2 {
  3     init();            //引脚初始化    
  4     bark();            //响一下,提示用户
  5     welcome();        //欢迎    
  6     
  7     while(1)
  8     {
  9         prompt();        //命令提示符
 10         
 11         //接收一条命令
 12         getcommand(rbuf, sizeof(rbuf));
 13         
 14         switch(rbuff){
 15             case "":        prompt(); break;
 16             case "?":        showhelp();
 17             case "help":    showhelp(); break;
 18             case "led run":    led(&rbuf, sizeof(rbuf)); break;
 19             case "bark":    bark(); break;
 20             default:        break;
 21         }
 22     }
 23 }
 24 
 25 void getcommand(char* rbuf, int size)
 26 {
 27     int i = 0;
 28     
 29     while((rbuf != '\n') && (i <= size)){
 30             while(URTSTAT0 & 0X01);    //等待缓冲区接收到数据
 31             rbuf[i] = URXH0;
 32             i++;
 33         }
 34     rbuff[i-1] = '\0';
 35 }
 36 
 37 static void delay(char t)
 38 {
 39     int i, j;
 40     for(; t > 0; t--)
 41     for(i = 0; i < 512; i++)
 42     for(i = 0; i < 256; i++);
 43 }
 44 static void sendbyte(char c)
 45 {
 46     while(!(UTXH0 & 0X40));
 47     UTXH0 = c;
 48 }
 49 
 50 void print(char* s, int size)
 51 {
 52     int i;
 53 
 54     for(i = 0; i < size; i++)
 55         sendbyte(s[i]);
 56 }
 57 
 58 static void init(void)
 59 {
 60     //设置 GPB 0 5 6 8 10 为输出且上拉
 61     GPBCON = 0XDDD7FD;
 62     GPBPUD &= 0X000;
 63     ULCON0 &= 0X00;
 64     ULCON0 |= 0X03;
 65     UCON0 = 0X0805;    //PCLK & POLL
 66     UBRDIV0 =0X1A;  //波特率115200
 67 }
 68 static void prompt(void)
 69 {
 70     sendbyte('>');
 71 }
 72 
 73 static void welcome(void)
 74 {
 75     char welcome[] = "\nWelcome!\n
 76                     You are using a simple shell,\n
 77                     type ? or help for the first time.\n";
 78     print(&welcome, sizeof(welcome));
 79 }
 80 
 81 static void showhelp(void)
 82 {
 83     char help[] = "You can use these command in our shell:\n
 84                     ?\nhelp\n
 85                     led run\n
 86                     bark\n";
 87     print(&help, sizeof(help));
 88 }
 89 
 90 static void bark(void)
 91 {
 92     GPBDAT |= 0X01;
 93     delay(1);
 94     GPBDAT &= 0X00;
 95 }
 96 
 97 /* 
 98  * 下面这个函数有必要解释一下,它将一个字符串
 99  * 转化成字符串数组,用在带参数的命令输入中。
100  *
101  * 实现的过程是:
102  *    1.令 i 指向带空格的字符串第一个字符;
103  *    2.令 j 指向 i,并由 j 扫描一个连贯的字符串;
104  *    3.令 i 移动到 j 扫描到的连贯字符串末尾,跳到第二步;
105  *    4.直到 j 扫描到字符串结束符。
106  *
107  * 细节:
108  *    1.扫描后产生的字符串都没有结束符,需要添加。
109  *    2.注意 i += (j + 1) 这一句表示跳过扫描到的字符串
110  *    和空格符移动指针到下一个字符串
111  */
112 static int getargv(char* dest[], char* src)
113 {
114     int i, j;
115     for(i = 0; src[i] != '\0'; i += (j + 1)){
116         for(j = i; src[j] != ('0' || '\0'); j++){
117             dest[i][j] = src[i+j];
118         }
119         dest[i][j] = '\0';
120     }
121     return 0;
122 }
123 
124 void led(char* s, int size)
125 {
126     int ret;
127     //char help = "Usage: led [type] [num ...]\n";
128     char* argv[10];
129     ret = getargv(&argv, &s);
130     if(ret != -1){
131         switch(argv[1]){
132             case "run":        ledrun(); break;
133             default:        break;
134         }
135     }
136 }

 

posted @ 2012-05-02 21:46  jinfengswust  阅读(211)  评论(0编辑  收藏  举报