【转】GD32F150R8]02、与Labview 之VISA 串口通信2

[复制链接]
1017|4
 楼主| haolaishi 发表于 2015-7-18 09:08 | 显示全部楼层 |阅读模式
回顾一下上一篇
简单的实现GD32F150R8 与Labview 之间的通讯,代码如下
  switch (cGetChar)
  {.......................
   }

cGetChar 大小决定任务的复杂性与扩展性。这里意味着最多有且仅有128种的扩展,并且也不利于数据通信。并且在可读性上很差在日后维护性上带来很大的不足。

采用command line 进行扩展。其实很简单,只不过是性字符串的比较
利于命令"set led %d\r\n",却对led显示的模式进行设置
但串口接收到\r\n时,对command 进行分析,并且与GD32F150R8中注册的command进行寻找配对
当找到时,调用其对应的函数,进行解析。而main函数就变得很简单
关键代码如下:
  1. int main(void)
  2. {
  3.     //int i;
  4.   char cGetChar;
  5.     EVB_LEDConfig();
  6.     EVB_Uart2Config();

  7.   PRINTF("\r\nLabview & GD32F150\r\n");


  8.   while(1)
  9.   {
  10.    run_cmd();
  11.   }
  12. }
  1. char *
  2. get_line (char *line)
  3. {
  4.     int pos;
  5.     int ch;

  6.     pos = 0;
  7.     ch = (int)uif_in_char();
  8.     while ( (ch != 0x0D /* CR */) &&
  9.             (ch != 0x0A /* LF/NL */) &&
  10.             (pos < UIF_MAX_LINE))
  11.     {
  12.         switch (ch)
  13.         {
  14.             case 0x08:      /* Backspace */
  15.             case 0x7F:      /* Delete */
  16.                 if (pos > 0)
  17.                 {
  18.                     pos -= 1;
  19.                     uif_out_char(0x08);    /* backspace */
  20.                     uif_out_char(' ');
  21.                     uif_out_char(0x08);    /* backspace */
  22.                 }
  23.                 break;
  24.             default:
  25.                 if ((pos+1) < UIF_MAX_LINE)
  26.                 {
  27.                     if ((ch > 0x1f) && (ch < 0x80))
  28.                     {
  29.                         line[pos++] = (char)ch;
  30.                         uif_out_char((char)ch);
  31.                     }
  32.                 }
  33.                 break;
  34.         }
  35.         ch = (int)uif_in_char();
  36.     }
  37.     line[pos] = '\0';
  38.     uif_out_char(0x0D);    /* CR \r 回车*/
  39.     uif_out_char(0x0A);    /* LF \n 换行*/

  40.     return line;
  41. }


  42. void
  43. run_cmd (void)
  44. {
  45.     /*
  46.      * Global array of pointers to emulate C argc,argv interface
  47.      */
  48.     int argc;
  49.     char *argv[UIF_MAX_ARGS + 1];   /* one extra for null terminator */

  50.     get_line(cmdline1);

  51.   argc = make_argv(cmdline1,argv);
  52.     //if (!(argc = make_argv(cmdline1,argv)))
  53.   if( argc==0 )
  54.     {
  55.         /* no command entered, just a blank line */
  56.         strcpy(cmdline1,cmdline2);
  57.         argc = make_argv(cmdline1,argv);
  58.     }
  59.     cmdline2[0] = '\0';

  60.     if (argc)
  61.     {
  62.         int i;
  63.         for (i = 0; i < UIF_NUM_CMD; i++)
  64.         {
  65.             if (strcasecmp(UIF_CMDTAB.cmd,argv[0]) == 0)
  66.             {
  67.                 if (((argc-1) >= UIF_CMDTAB.min_args) &&
  68.                     ((argc-1) <= UIF_CMDTAB.max_args))
  69.                 {
  70.                     if (UIF_CMDTAB.flags & UIF_CMD_FLAG_REPEAT)
  71.                     {
  72.                         strcpy(cmdline2,argv[0]);
  73.                     }
  74.                     UIF_CMDTAB.func(argc,argv);
  75.                     return;
  76.                 }
  77.                 else
  78.                 {
  79.                     uif_printf(SYNTAX,argv[0]);
  80.                     return;
  81.                 }
  82.             }
  83.         }
  84.         uif_printf(INVCMD,argv[0]);
  85.         uif_printf(HELPMSG);
  86.     }
  87. }
以后的扩展都在UIF_SETCMD UIF_SETCMDTAB[]={
{"led",0,1,uif_cmd_led,"set led"}
};
进行不断的扩展,就能实现很复杂的响应
  1. void
  2. uif_cmd_led (int argc, char **argv)
  3. {
  4. int success = false;
  5. uint32 data =0;
  6. (void)argc;
  7.     (void)argv;

  8. data = get_value(argv[2],&success,10);

  9. switch (data)
  10. {
  11.   case 0:
  12.     EVB_LEDControl(LED1, LED_OFF);
  13.     EVB_LEDControl(LED2, LED_OFF);
  14.     break;
  15.   case 1:
  16.     EVB_LEDControl(LED1, LED_ON);
  17.     EVB_LEDControl(LED2, LED_OFF);
  18.     break;
  19.   case 2:
  20.     EVB_LEDControl(LED1, LED_OFF);
  21.     EVB_LEDControl(LED2, LED_ON);
  22.     break;
  23.   case 3:
  24.     EVB_LEDControl(LED1, LED_ON);
  25.     EVB_LEDControl(LED2, LED_ON);
  26.     break;

  27.   default:
  28.     break;
  29. }
  30. }



  31. UIF_SETCMD UIF_SETCMDTAB[]={
  32. {"led",0,1,uif_cmd_led,"set led"}
  33. };
  34. const int UIF_NUM_SETCMD = UIF_SETCMDTAB_SIZE;


 楼主| haolaishi 发表于 2015-7-18 09:09 | 显示全部楼层
Labview 程序
1.png
2.png
 楼主| haolaishi 发表于 2015-7-18 09:09 | 显示全部楼层
Labview程序
Simple Serial.rar (24.04 KB, 下载次数: 12)
 楼主| haolaishi 发表于 2015-7-18 09:10 | 显示全部楼层
GD32F150R8 程序
Colibri_GD32F150R8.rar (2.56 MB, 下载次数: 20)
若相依 发表于 2015-7-26 09:39 | 显示全部楼层
代码洗的很规范,不错,收藏了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:不忘初心,积极乐观,勤且道义!

243

主题

1996

帖子

12

粉丝
快速回复 在线客服 返回列表 返回顶部