[STM32F4] 【STM32F469I试用】+emWin实战应用②简易串口调试

[复制链接]
 楼主| 湛只为无双 发表于 2016-1-19 18:51 | 显示全部楼层 |阅读模式
本帖最后由 湛只为无双 于 2016-1-19 21:35 编辑

感谢21IC网,希望大家在看帖子的同时能够给我投上一票,谢谢你们了,http://bbs.21ic.com/icview-1277786-1-1.html
湛只为无双
基于标准库的Keil工程_带延时LED按键串口http://bbs.21ic.com/icview-1238108-1-2.html
今天给大家介绍的是之前发布的帖子里面的第二个应用,一个简易的串口接收控制。

Screen06.bmp

首先是主界面,图中的第二按钮,简易串口调试功能,当点击第二个按钮后,进可以进入到串口界面,界面的显示如下:
Screen03.bmp
里面包含有波特率,校验位,数据位和停止位的选择,在选择的旁边是一个编辑框用于显示串口接收到的数据,实现了一个简单的串口接收,下面的按钮主要是打开串口,退出应用和清空数据接收区的。
然后可以选择合适的波特率等,当前只添加了几个常用的波特率,如果需要可以根据自己的需求来自由设定
Screen02.bmp
选择到合适的波特率以后,就可以打开串口了,在打开串口以后就不能更改那几个下拉列表了,也就是显示灰色的图标,当关闭后下拉列表又可以重新使用。
Screen11.bmp
一、程序的概述及介绍:
首先是看下软件的程序源码,通过资源列表建立一些资源数据:
  1. /*********************************************************************
  2. *
  3. *       Dialog resource
  4. *
  5. * This table conatins the info required to create the dialog.
  6. * It has been created by ucGUIbuilder.
  7. */

  8. static const GUI_WIDGET_CREATE_INFO _aDialogTwoCreate[] = {
  9.     { FRAMEWIN_CreateIndirect,  "串口调试助手",      0,                       0,  0,  800,480,0,0},
  10.     { TEXT_CreateIndirect,      "波特率",            GUI_ID_TEXT0,            1,  15, 56, 16, 0,0},
  11.     { TEXT_CreateIndirect,      "校验位",            GUI_ID_TEXT1,            1,  45, 56, 16, 0,0},
  12.     { TEXT_CreateIndirect,      "数据位",            GUI_ID_TEXT2,            1,  75, 56, 16, 0,0},
  13.     { TEXT_CreateIndirect,      "停止位",            GUI_ID_TEXT3,            1,  105,56, 16, 0,0},
  14.     { MULTIEDIT_CreateIndirect, "MULTIEDIT",         GUI_ID_MULTIEDIT0,       154,12, 630,200,0,0},
  15.     { DROPDOWN_CreateIndirect,  "DROPDOWN",          GUI_ID_DROPDOWN0,        63, 12, 85, 80, 0,0},
  16.     { DROPDOWN_CreateIndirect,  "DROPDOWN",          GUI_ID_DROPDOWN1,        63, 42, 85, 80, 0,0},
  17.     { DROPDOWN_CreateIndirect,  "DROPDOWN",          GUI_ID_DROPDOWN2,        63, 72, 85, 80, 0,0},
  18.     { DROPDOWN_CreateIndirect,  "DROPDOWN",          GUI_ID_DROPDOWN3,        63, 102,85, 80, 0,0},
  19.     { BUTTON_CreateIndirect,    "打开",              GUI_ID_BUTTON0,          19, 151,114,61, 0,0},
  20.         { BUTTON_CreateIndirect,    "退出",              GUI_ID_BUTTON1,          19, 309,114,61, 0,0},
  21.         { BUTTON_CreateIndirect,    "清空",              GUI_ID_BUTTON2,          19, 230,114,61, 0,0},
  22. };
  23. void DialogTwo(void)
  24. {
  25.         if(SerialTaskHandle == NULL)
  26.         {
  27.                 xTaskCreate(vDialogSerialTask,( signed portCHAR * )"Serial",512,NULL, tskIDLE_PRIORITY+6, &SerialTaskHandle);
  28.         }
  29.         GUI_CreateDialogBox(_aDialogTwoCreate, GUI_COUNTOF(_aDialogTwoCreate), &_cbDialogTwoCallback, 0, 0, 0);
  30. }
其中包含了穿件串口接收任务xTaskCreate(vDialogSerialTask,( signed portCHAR * )"Serial",512,NULL, tskIDLE_PRIORITY+6, &SerialTaskHandle)
和界面显示GUI_CreateDialogBox(_aDialogTwoCreate, GUI_COUNTOF(_aDialogTwoCreate), &_cbDialogTwoCallback, 0, 0, 0);
并设置回调函数_aDialogTwoCreate
在串口接收任务里面主要功能是周期性检测串口的接收标志位,但有数据来临时,就将新的数据添加至MultiEdit编辑框里面
  1. void vDialogSerialTask( void *pvParameters )
  2. {
  3.         while(1)
  4.         {
  5.                 if(SerialOpen_flag==1 && hMultiEditRead!=0)
  6.                 {
  7.                         if(USART3_RX_STA & 0x8000)
  8.                         {
  9.                                 USART3_RX_BUF[USART3_RX_STA&0x7fff]=0;
  10.                                 MULTIEDIT_AddText(hMultiEditRead,(const char *)USART3_RX_BUF);
  11.                                 USART3_RX_STA=0;
  12.                         }
  13.                 }
  14.                 else if(hMultiEditRead == 0)
  15.                 {
  16.                         SerialTaskHandle = NULL;
  17.                         vTaskDelete(NULL);
  18.                 }
  19.                 vTaskDelay(100);
  20.         }
  21. }
二、与STemWin相关的回调函数
STemWin里面比较重要的是就是界面的回调函数机制,是否能够比价好的使用回调函数可以实现很好的界面设计。
首先看下回调函数的内容:
  1. /*********************************************************************
  2. *
  3. *       Dialog callback routine
  4. */
  5. static void _cbDialogTwoCallback(WM_MESSAGE * pMsg)
  6. {
  7.     int NCode, Id;
  8.     WM_HWIN hWin = pMsg->hWin;
  9.     switch (pMsg->MsgId)
  10.     {
  11.         case WM_INIT_DIALOG:
  12.             InitDialog(pMsg);
  13.             break;
  14.         case WM_NOTIFY_PARENT:
  15.             Id = WM_GetId(pMsg->hWinSrc);
  16.             NCode = pMsg->Data.v;        
  17.             
  18.                         switch(NCode)
  19.                         {
  20.                         case WM_NOTIFICATION_RELEASED:
  21.                                 switch(Id)
  22.                                 {
  23.                                 case GUI_ID_BUTTON0:
  24.                                         DialogTwoSerial_Init(hWin);
  25.                                         break;
  26.                                 
  27.                                 case GUI_ID_BUTTON1:
  28.                                         hMultiEditRead = 0;
  29.                                         DialogTwoSerial_Close();
  30.                                         GUI_EndDialog(hWin,0);
  31.                                         break;
  32.                                 
  33.                                 case GUI_ID_BUTTON2:
  34.                                         MULTIEDIT_SetText(hMultiEditRead,"");
  35.                                         break;
  36.                                 }
  37.                                 break;
  38.                         }
  39.             break;
  40.         default:
  41.             WM_DefaultProc(pMsg);
  42.     }
  43. }
在回调函数里面,获取到窗口的句柄,然后进行不同消息下系统的响应函数,使用到了switch和case结构,其中第一个case为初始化窗口的回调函数InitDialog(pMsg):
  1. /*****************************************************************
  2. **      FunctionName:void InitDialog(WM_MESSAGE * pMsg)
  3. **      Function: to initialize the Dialog items
  4. **                                                      
  5. **      call this function in _cbCallback --> WM_INIT_DIALOG
  6. *****************************************************************/

  7. void InitDialog(WM_MESSAGE * pMsg)
  8. {
  9.     WM_HWIN hWin = pMsg->hWin;
  10.     //
  11.     //GUI_ID_DROPDOWN0
  12.     //
  13.     DROPDOWN_AddString(WM_GetDialogItem(hWin,GUI_ID_DROPDOWN0),"9600");
  14.     DROPDOWN_AddString(WM_GetDialogItem(hWin,GUI_ID_DROPDOWN0),"14400");
  15.     DROPDOWN_AddString(WM_GetDialogItem(hWin,GUI_ID_DROPDOWN0),"19200");
  16.     DROPDOWN_AddString(WM_GetDialogItem(hWin,GUI_ID_DROPDOWN0),"38400");
  17.     DROPDOWN_AddString(WM_GetDialogItem(hWin,GUI_ID_DROPDOWN0),"56000");
  18.     DROPDOWN_AddString(WM_GetDialogItem(hWin,GUI_ID_DROPDOWN0),"57600");
  19.     DROPDOWN_AddString(WM_GetDialogItem(hWin,GUI_ID_DROPDOWN0),"115200");
  20.         DROPDOWN_SetListHeight(WM_GetDialogItem(hWin,GUI_ID_DROPDOWN0),128);
  21.     //
  22.     //GUI_ID_MULTIEDIT0
  23.     //
  24.         hMultiEditRead = WM_GetDialogItem(hWin,GUI_ID_MULTIEDIT0);
  25.     MULTIEDIT_SetFont(hMultiEditRead,&GUI_FontHZ16);
  26.         MULTIEDIT_SetAutoScrollV(hMultiEditRead,1);
  27.         MULTIEDIT_SetWrapChar(hMultiEditRead);
  28.         MULTIEDIT_SetFocussable(hMultiEditRead,0);
  29.     //
  30.     //GUI_ID_DROPDOWN1
  31.     //
  32.     DROPDOWN_AddString(WM_GetDialogItem(hWin,GUI_ID_DROPDOWN1),"NONE");
  33.     DROPDOWN_AddString(WM_GetDialogItem(hWin,GUI_ID_DROPDOWN1),"EVEN");
  34.     DROPDOWN_AddString(WM_GetDialogItem(hWin,GUI_ID_DROPDOWN1),"ODD");
  35.         DROPDOWN_SetListHeight(WM_GetDialogItem(hWin,GUI_ID_DROPDOWN1),64);
  36.     //
  37.     //GUI_ID_DROPDOWN2
  38.     //
  39.     DROPDOWN_AddString(WM_GetDialogItem(hWin,GUI_ID_DROPDOWN2),"8B");
  40.     DROPDOWN_AddString(WM_GetDialogItem(hWin,GUI_ID_DROPDOWN2),"9B");
  41.         DROPDOWN_SetListHeight(WM_GetDialogItem(hWin,GUI_ID_DROPDOWN2),48);
  42.     //
  43.     //GUI_ID_DROPDOWN3
  44.     //
  45.     DROPDOWN_AddString(WM_GetDialogItem(hWin,GUI_ID_DROPDOWN3),"1");
  46.     DROPDOWN_AddString(WM_GetDialogItem(hWin,GUI_ID_DROPDOWN3),"0.5");
  47.     DROPDOWN_AddString(WM_GetDialogItem(hWin,GUI_ID_DROPDOWN3),"2");
  48.     DROPDOWN_AddString(WM_GetDialogItem(hWin,GUI_ID_DROPDOWN3),"1.5");
  49.         DROPDOWN_SetListHeight(WM_GetDialogItem(hWin,GUI_ID_DROPDOWN3),80);
  50. }
在初始化中分别添加了不同控件的初始条件,包含有下拉列表的每个选项,这样就实现了不同类型选项的添加。
然后当有按钮的消息发生的时候,就需要对按钮做出响应,这就使用到了WM_NOTIFY_PARENT和WM_NOTIFICATION_RELEASED,本次设计里面主要包含有打开串口和关闭串口,清空串口和退出串口。分别使用到的是不同函数调用,在工程文件里面使用到的是DialogTwoSerial.c这个文件,在这里需要注意的是,如果退出串口一定要关闭串口的接收中断,否则的话会出现死机的情况发生。具体的程序设计请看上一篇帖子上传的数据,里面有已经写好的内容。
工程文件在之前的第一篇帖子里面:【STM32F469I试用】+emWin实战应用①LED控制界面



 楼主| 湛只为无双 发表于 2016-1-19 18:52 | 显示全部楼层
占楼备用,等待编辑~~~~
cingcing 发表于 2016-3-24 18:16 | 显示全部楼层
大力支持一个
西街耳呦 发表于 2017-5-9 14:12 | 显示全部楼层
楼主,我把你这程序烧进去,汉字为什么全部像打码一样模糊,英文可以正常显示,求指教
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

171

帖子

9

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

15

主题

171

帖子

9

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