95992828九五至尊2

串口通讯简单例程,文本编辑框不难例程

二月 7th, 2019  |  617888九五至尊2

 

 

上一篇:[stm32][ucos]
1、基于ucos操作系统的LED闪烁、串口通讯不难例程

* 内容简述:

 

      本例程操作系统选用ucos2.86a本子, 建立了5个义务
            任务名                                             优先级
            APP_TASK_START_PRIO                               2  
         主任务              
            Task_Com1_PRIO                                    4      
     COM1通讯职分
            Task_Led1_PRIO                                    7      
     LED1 闪亮职务
            Task_Led2_PRIO                                    8      
     LED2 闪烁职分
            Task_Led3_PRIO                                    9      
     LED3 闪烁任务
         当然还蕴藏了系统任务:
            OS_TaskIdle                 
空闲义务—————–优先级最低
            OS_TaskStat                 
总括运行时刻的职分——-优先级次低 

* 内容简述:


        本例程操作系统拔取ucos2.86a本子, 建立了7个职责
            任务名                                             优先级
            APP_TASK_START_PRIO                               2  
         主任务
            APP_TASK_USER_IF_PRIO                             13  
     ucgui界面职责
            APP_TASK_KBD_PRIO                                 12  
     触摸屏职责
            Task_Com1_PRIO                                    4      
     COM1通讯职务
            Task_Led1_PRIO                                    7      
     LED1 闪耀职责
            Task_Led2_PRIO                                    8      
     LED2 闪烁任务
            Task_Led3_PRIO                                    9      
     LED3 闪烁职务
        当然还包括了系统职务:
            OS_TaskIdle                  
空闲任务—————–优先级最低
            OS_TaskStat                 
总括运行时刻的天职——-优先级次低

 


 1、主职务建立:

 *刺探一下:

1 //建立主任务, 优先级最高  建立这个任务另外一个用途是为了以后使用统计任务
2    os_err = OSTaskCreate((void (*) (void *)) App_TaskStart,                        //指向任务代码的指针
3                           (void *) 0,                                          //任务开始执行时,传递给任务的参数的指针
4                (OS_STK *) &App_TaskStartStk[APP_TASK_START_STK_SIZE - 1],    //分配给任务的堆栈的栈顶指针   从顶向下递减
5                (INT8U) APP_TASK_START_PRIO);                                //分配给任务的优先级

>_<“ uCOSII介绍:

  • 这一个利用老版本的天职建立函数,第四个参数通俗的布道就是该任务对应的函数,如下:

    1 static void App_TaskStart(void p_arg)
    2 {
    3 (void) p_arg;
    4 //初步化ucos时钟节拍
    5 OS_CPU_SysTickInit(); /
    Initialize the SysTick. /
    6
    7 //使能ucos 的总结职责 8 #if (OS_TASK_STAT_EN > 0)
    9 //—-统计职责初阶化函数
    10 OSStatInit(); /
    Determine CPU capacity. */
    11 #endif
    12 //建立其余的任务13 App_TaskCreate();
    14
    15 while (1)
    16 {
    17 //1秒一回循环
    18 OS提姆eDlyHMSM(0, 0,1, 0);
    19 }
    20 }

  • 当主职责建立未来,程序就转到该函数处,调用
    App_TaskCreate();建立其余义务,然后进入死循环,大家会发觉:那里的主职分在建立其他职务后就没啥成效的,那时可以调用相应的函数将负责人务给杀死,那里没有那样做,只是让主义务进入循环。

嵌入式实时操作系统uCosII是由美利坚合营国工程师JeanJ.Labrosse所创,它在中原的盛行源于那本被邵贝贝引进翻译的闻名书籍《嵌入式实时操作系统uCos-II》,那本书是上学ucosII
的宝典,即便很厚,但通晓了要害概念,再结合实际应用例程,如故很简单看懂的。uCosII通过了United States航天管理局(FAA)的新余注解,可以用来飞机、航天器与性情命攸关的控制连串中。也就是说,用户可以放心将uCosII用到祥和的制品中,ucGUI也是Micrium公司的产品, 
在本例程里使用了ucGUI3.90本子,它为嵌入式应用提供了作用强大的图片用户接口,使得用户在支付具有人机界面的接纳时,可以很便宜做出复杂精致的用户浮现界面。并提供了互相的接口。PS:现在邵贝贝的嵌入式实时操作系统已经到uCos-III了。


>_<“ uCOSII特点:

 

  • [1] 可移植性:uCosII源码绝一大半是用移植性很强的ANSI
    C写的。与微处理硬件相关的有的是用汇编语言写的。uCOS可以在大部8位、16位、32位以及64位电脑、微控制器及数字信号处理器(DSP)上运行。
  • [2]
    可裁剪性:可以通过开关条件编译选项,来定义哪些uCosII的功能模块用于用户程序,方便控制代码运行所占据的长空及内存。
  • [3]
    可剥夺性:uCOSII是全然可剥夺型的实时内核,它连接运行处于就绪状态下的优先级最高的天职。
  • [4]
    多任务:uCOSII可以管理64个任务,每个职务对应一个优先级,并且是各不一致。其中8个义务保留给uCOSII。用户的应用程序可以实际行使56个职责。
  • [5]
    可明显:绝半数以上uCosII的函数调用和劳动的施行时间具有可眼看,也就是说用户总是能分晓函数调用与劳动推行了多久。
  • [6] 职责栈:
    每个职分都有温馨单身的栈,uCOSII规定每个任务有例外的栈空间。
  • [7] 系统服务:uCOSII 提供千千万万种类服务, 
    例如信号量、互斥信号量、事件申明、信息邮箱、音信队列、内存的报名与释放及时间管理函数等。
  • [8] 中断管理:
    中断可以使正在推行的天职暂时挂起,中断嵌套层数可达255层。

2、其余义务建立:

>_<“ uCGUI特点:

 1 static  void App_TaskCreate(void)
 2 {
 3    //CPU_INT08U os_err;
 4  
 5    //Com1_SEM=OSSemCreate(1);             //建立串口1中断的信号量
 6    Com1_MBOX=OSMboxCreate((void *) 0);             //建立串口1中断的消息邮箱
 7    
 8    //串口1接收及发送任务---------------------------------------------------------    
 9    OSTaskCreateExt(Task_Com1,                                      //指向任务代码的指针
10                        (void *)0,                                      //任务开始执行时,传递给任务的参数的指针
11                     (OS_STK *)&Task_Com1Stk[Task_Com1_STK_SIZE-1],//分配给任务的堆栈的栈顶指针   从顶向下递减
12                     Task_Com1_PRIO,                                  //分配给任务的优先级
13                     Task_Com1_PRIO,                                  //预备给以后版本的特殊标识符,在现行版本同任务优先级
14                     (OS_STK *)&Task_Com1Stk[0],                      //指向任务堆栈栈底的指针,用于堆栈的检验
15                     Task_Com1_STK_SIZE,                              //指定堆栈的容量,用于堆栈的检验
16                     (void *)0,                                      //指向用户附加的数据域的指针,用来扩展任务的任务控制块
17                     OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR);      //选项,指定是否允许堆栈检验,是否将堆栈清0,任务是否要进行浮点运算等等。
18    //LED1 闪烁任务------------------------------------------------------
19    OSTaskCreateExt(Task_Led1,(void *)0,(OS_STK *)&Task_Led1Stk[Task_Led1_STK_SIZE-1],Task_Led1_PRIO,Task_Led1_PRIO,(OS_STK *)&Task_Led1Stk[0],
20                     Task_Led1_STK_SIZE,
21                     (void *)0,
22                     OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR);
23    
24    //LED2 闪烁任务------------------------------------------------------
25    OSTaskCreateExt(Task_Led2,(void *)0,(OS_STK *)&Task_Led2Stk[Task_Led2_STK_SIZE-1],Task_Led2_PRIO,Task_Led2_PRIO,(OS_STK *)&Task_Led2Stk[0],
26                     Task_Led2_STK_SIZE,
27                     (void *)0,
28                     OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR); 
29    
30    //LED3 闪烁任务------------------------------------------------------
31    OSTaskCreateExt(Task_Led3,(void *)0,(OS_STK *)&Task_Led3Stk[Task_Led3_STK_SIZE-1],Task_Led3_PRIO,Task_Led3_PRIO,(OS_STK *)&Task_Led3Stk[0],
32                     Task_Led3_STK_SIZE,
33                     (void *)0,
34                     OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR);  
35 }

UCGUI 的筹划目的是为利用 LCD 作为图形展现装置的应用提供便捷的与 LCD
控制器独立及电脑独立的图纸用户接口。它符合于单职责环境及多义务环境,如私用的操作系统或是商业的RTOS(实时操做系统。UCGUI
以 C 源码方式提供, 并适用于任意 LCD 控制器和 CPU
下其它尺寸的诚实突显或编造显示。它含有以下特点(一般特性):

  •  这里是确立三个子义务第四个是串口通讯的天职,一会加以,下边多个是LED闪烁任务,那里举Task_Led1说明:

    1 //LED1闪烁职分—————————————-
    2 static void Task_Led1(void* p_arg)
    3 {
    4 (void) p_arg;
    5 while (1)
    6 {
    7 LED_LED1_ON();
    8 OSTimeDlyHMSM(0, 0, 0, milsec1);
    9
    10 LED_LED1_OFF();
    11 OSTimeDlyHMSM(0, 0, 0, milsec1);
    12 }
    13 }

  •  可见LED闪烁义务实际就是一个最为循环,让灯的电平每隔一定时间高、每隔一定时间低来呈现闪烁的职能。那么,他是怎么着贯彻任务切换的吧?那就是操作系统的功力了,操作系统按照每个职分的优先级,在各类子义务执行到自然时期查询当前挂起任务的优先级来摘取优先级最高的举办实施。下边是在app_cfg.h中对那些职分优先级的扬言:

    1 #define APP_TASK_START_PRIO 2
    2 #define APP_TASK_USER_IF_PRIO 13
    3 #define APP_TASK_KBD_PRIO 12
    4 #define Task_Com1_PRIO 4
    5 #define Task_Led1_PRIO 7
    6 #define Task_Led2_PRIO 8
    7 #define Task_Led3_PRIO 9

  •  可知主职分的优先级最高,串口通讯的先行级其次,LED闪烁的事先级趋于中等,依次为7、8、9,

    1 static void Task_Com1(void p_arg){
    2 INT8U err;
    3 unsigned char
    msg;
    4 (void)p_arg;
    5 while(1){
    6
    7 //OSSemPend(Com1_SEM,0,&err); //等待串口接收指令成功的信号量
    8 msg=(unsigned char *)OSMboxPend(Com1_MBOX,0,&err); //等待串口接收指令成功的信箱新闻 9 //USART_OUT(USART1,&TxBuffer1[0]);
    10 if(msg[0]==’L’&&msg[1]==0x31){
    11 milsec1=atoi(&msg[3]); //LED1 的延时飞秒 (mini and V3)
    12 USART_OUT(USART1,”\r\n”);
    13 USART_OUT(USART1,”LED1: %d ms 间隔闪烁”,milsec1);
    14 }
    15 else if(msg[0]==’L’&&msg[1]==0x32){
    16 milsec2=atoi(&msg[3]); //LED2 的延时微秒 (only V3)
    17 USART_OUT(USART1,”\r\n”);
    18 USART_OUT(USART1,”LED2: %d ms 间隔闪烁”,milsec2);
    19 }
    20 else if(msg[0]==’L’&&msg[1]==0x33){
    21 milsec3=atoi(&msg[3]); //LED3 的延时阿秒 (only V3)
    22 USART_OUT(USART1,”\r\n”);
    23 USART_OUT(USART1,”LED3: %d ms 间隔闪烁”,milsec3);
    24 }
    25 }
    26 }

  •  那里最主要讲一下串口通讯的职分:那里运用音讯邮箱举行音信传递,在创制其他任务App_TaskCreate(void)的起先就率先创设串口的音讯邮箱:Com1_MBOX=OSMboxCreate((void *) 0);然后在串口通信的天职中跻身循环后就一贯等候新闻邮箱的音讯(第8行),倘使没有新闻过来就从来守候,在此时期其余任务可以拓展,一旦有新闻发送过来,由于串口通讯的先期级较高,就能神速响应,根据收到的音讯msg来重新设置led闪烁的频率。那里因为串口接收要用到中断,所以上面就说说串口通讯的吸纳中断部分。

    617888九五至尊2, 1 void USART1_IRQHandler(void)
    2 {
    3 unsigned int i;
    4 unsigned char msg[50];
    5 OS_CPU_SR cpu_sr;
    6
    7 OS_ENTER_CRITICAL(); //保存全局中断标志,关总中断// Tell uC/OS-II that we are starting an ISR
    8 OSIntNesting++;
    9
    10 OS_EXIT_CRITICAL(); //复苏全局中断标志
    11
    12 //OSTimeTick(); // Call uC/OS-II’s OSTimeTick(),在os_core.c文件里定义,主要判断延时的职务是还是不是计时到
    13
    14 if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //判断读寄存器是或不是非空
    15 {
    16 // Read one byte from the receive data register
    17
    18 msg[RxCounter1++]= USART_ReceiveData(USART1); //将读寄存器的数额缓存到接收缓冲区里
    19
    20 if(msg[RxCounter1-1]==’L’){msg[0]=’L’; RxCounter1=1;} //判断起先标志
    21 if(msg[RxCounter1-1]==’F’) //判断为止标志是还是不是是”F”
    22
    23 {
    24 for(i=0; i< RxCounter1; i++){ 25 TxBuffer1[i] =msg[i]; //将接收缓冲器的数量转到发送缓冲区,准备转发26
    27 }
    28
    29 TxBuffer1[RxCounter1]=0; //接收缓冲区终止符
    30 RxCounter1=0;
    31 //OSSemPost(Com1_SEM);
    32 OSMboxPost(Com1_MBOX,(void *)&msg);
    33 }
    34 }
    35 if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET) //
    36 {
    37 USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
    38 }
    39 OSIntExit(); //在os_core.c文件里定义,若是有更高优先级的职务就绪了,则履行一次任务切换
    40 }

  • 那里接收串口数据,当发现是一体化的帧时,就调用OSMboxPost(Com1_MBOX,(void *)&msg);发送一个信箱音讯,进而那边的串口任务从挂起到擢升,执行相应的经过。

  • [1] 适用其余 8/16/32 位 CPU, 只要有相对应的正统 C 编译器.
  • [2] 任何的控制器的 LCD 显示器(单色,灰度,颜色), 只要有适合的 LCD
    驱动可用.
  • [3] 在小情势展现时毫无 LCD 控制器.
  • [4] 所有接口帮衬使用宏举行配制.
  • [5] 显示尺寸可定制.
  • [6] 字符和位图可在 LCD
    显示器上的妄动起源突显,并不只局限于偶数对齐的地点起源.
  • [7] 程序在尺寸和进程上都进展了优化.
  • [8] 编译时允许开展分歧的优化.
  • [9] 对于迟迟一些的 LCD 控制器, LCD 显存可以映射到内存当中,
    从而减少访问次数到细微并完成更高的来得速度.
  • [10]清楚的安顿架构.
  • [11]支撑虚拟呈现, 虚拟展现可以比实际尺寸大(即加大).


 

 *概念须知:

3、硬件开始化部分

>_<“ 任务:

说了这么多,竟然忘了说硬件起先化的一部分啦!那里包涵系统时钟设置、引脚使能、中断使能…放在bsp.c文件里,在main函数伊始一贯调用BSP_Init();就可以。

职务平常是一个可是的巡回, 重临参数必须定义为void。
当职分起首实施时,会有一个参数传递给用户职务代码。uCosII可以管理64个职责,
其中系统保留了8个义务。开放给用户的有56个职分,每个义务的先期级都不一致,
职务的先期级号越低,职分的先行级越高,在那几个版本的uCosII中,义务的事先级号就是义务编号。
义务的情景自然是以下5种之一:

 1 void BSP_Init(void)
 2 {
 3   /* System Clocks Configuration --72M*/
 4   RCC_Configuration();   
 5   GPIO_Configuration();
 6   /* NVIC configuration */
 7   /*嵌套向量中断控制器 
 8       说明了USART1抢占优先级级别0(最多1位) ,和子优先级级别0(最多7位) */ 
 9   NVIC_Configuration();
10   USART_Config(USART1,115200);          //串口1初始化
11 }
  • [1]
    睡眠态:就是天职没有付诸ucosII调度的,也就是没用经过建立的职分。
    只保存在存储器空间里。
  • [2]
    就绪态:义务一旦确立,任务就进入就绪态。职责能够通过调用OSTasjDel()再次来到到睡眠态。
  • [3] 运行态:任曾几何时刻只好有一个职分处于运行态。
  • [4] 等待状态:正在周转的职分可以因而调用以下2
    个函数之一,将自身延迟一段时间。  那2
    个函数是OS提姆eDly()或OS提姆eDlyHMSM()。那个义务于是进入等待情况,一贯到函数中定义的延迟时间到。正在周转的任务可能在伺机某一事件的暴发,可以经过调用以下函数之一达成:OSFlagPend()
    , OSSemPend(),OSMutexPend(),
    OSMboxPend()或OSQPend()。借使某事件尚无暴发,调用上述函数的职务就进入了守候状态,直到等待的风云时有爆发了。当职务因等待事件被挂起时,下一个优先级最高的服服帖帖职分就拿走了CPU的使用权。当时间爆发了或等待延时晚点时,被挂起的任务就进入就绪态。
  • [5]
    中断服务态:正在运作的义务是足以被暂停的,被暂停的职分于是进入了刹车服务态,响应中断时,正在实践的职分被挂起,中断服务程序控制了CPU的使用权。从中断服务程序重返前,uCosII要认清被暂停的天职是不是是方今妥善职务里优先级最高的,假使不是,就进行优先级最高的至极任务。
    如若是,就执行被搁浅的那个义务。

617888九五至尊2 1617888九五至尊2 2

>_<“ 音信邮箱:

1 void RCC_Configuration(void)
2 {        
3   SystemInit(); 
4 }

那是uCosII中的一种通信机制,可以使一个职务如故暂停服务程序向另一个职分发送一个指针型的变量,平常该指针指向了一个富含了音信的特定数据结构。 
在例程中须求建立邮箱,用到了函数OSMboxCreate(), 
串口1中断服务程序用到了向邮箱发送一则消息的函数OSMboxPost(),
串口接收义务选择了等候邮箱中信息的函数OSMboxPend()。

void RCC_Configuration(void)


617888九五至尊2 3617888九五至尊2 4

*主干代码说明:

 1 void GPIO_Configuration(void)
 2 {
 3   GPIO_InitTypeDef GPIO_InitStructure;
 4 
 5   /*对控制LED指示灯的IO口进行了初始化,将端口配置为推挽上拉输出,口线速度为50Mhz。PA9,PA10端口复用为串口1的TX,RX。
 6   在配置某个口线时,首先应对它所在的端口的时钟进行使能。否则无法配置成功,由于用到了端口B,D,E, 因此要对这几个端口的时钟
 7   进行使能,同时由于用到复用IO口功能用于配置串口。因此还要使能AFIO(复用功能IO)时钟。*/
 8   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOB , ENABLE); 
 9   
10   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;                                 //LED1
11   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
12   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
13   GPIO_Init(GPIOB, &GPIO_InitStructure);                     
14   
15   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_3;                     //LED2, LED3
16   GPIO_Init(GPIOD, &GPIO_InitStructure);
17 }

>_<“ main():

void
GPIO_Configuration(void)

 1 int main(void)
 2 {
 3    CPU_INT08U os_err; 
 4    /* 禁止所有中断 */
 5    CPU_IntDis();
 6    
 7    /* ucosII 初始化 */
 8    OSInit();                                                  
 9 
10    /* 硬件平台初始化 */
11    BSP_Init();             
12                                
13    //默认LED闪烁间隔500ms
14    milsec1=500,milsec2=500,milsec3=500;              
15        
16    USART_OUT(USART1,"*LED1闪烁间隔:1ms--65535ms  指令L1 1F--L1 65535F *\r\n");//向串口1发送开机字符。          
17    USART_OUT(USART1,"*LED2闪烁间隔:1ms--65535ms  指令L2 1F--L1 65535F *\r\n");    
18    USART_OUT(USART1,"*LED3闪烁间隔:1ms--65535ms  指令L3 1F--L1 65535F *\r\n"); 
19    USART_OUT(USART1,"\r\n"); 
20    USART_OUT(USART1,"\r\n");        
21    //建立主任务, 优先级最高  建立这个任务另外一个用途是为了以后使用统计任务
22    os_err = OSTaskCreate((void (*) (void *)) App_TaskStart,                           //指向任务代码的指针
23                           (void *) 0,                                                //任务开始执行时,传递给任务的参数的指针
24                             (OS_STK *) &App_TaskStartStk[APP_TASK_START_STK_SIZE - 1],    //分配给任务的堆栈的栈顶指针   从顶向下递减
25                          (INT8U) APP_TASK_START_PRIO);                                //分配给任务的优先级
26              
27    OSTimeSet(0);             //ucosII的节拍计数器清0    节拍计数器是0-4294967295  
28    OSStart();                //启动ucosII内核   
29    return (0);
30 }

617888九五至尊2 5617888九五至尊2 6

PS:通过启动文件的起首化,首先在C代码里,执行main(),
在开行ucosII内核前先禁止CPU的间歇CPU_IntDis(),幸免启动进度中系统崩溃,然后对ucosII内核进行开首化OSInit(),以上七个函数都休想越发修改,在STM32阳台上一度被移植好了,对板子上的一部分用到的外设举行开头化设置BSP_Init(),
这一个函数包括了对系统时钟的装置RCC_Configuration(),将系统时钟设置为72MHz,对LED闪烁控制端口举办设置GPIO_Configuration(),对中断源进行配置NVIC_Configuration(),对下手控制进行安排tp_config(),对显示器接口FSMC举行配置,
板子上的外设初步化完成。

 1 void NVIC_Configuration(void)
 2 {
 3 
 4   //EXTI_InitTypeDef EXTI_InitStructure;
 5   NVIC_InitTypeDef NVIC_InitStructure;
 6   
 7   /* Configure one bit for preemption priority */
 8   #if defined (VECT_TAB_RAM)
 9   /* Set the Vector Table base location at 0x20000000 */ 
10   NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); 
11 #elif defined(VECT_TAB_FLASH_IAP)
12   NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x2000);
13 #else  /* VECT_TAB_FLASH  */
14   /* Set the Vector Table base location at 0x08000000 */ 
15   NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);   
16 #endif 
17 
18   /* Configure the NVIC Preemption Priority Bits */  
19   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
20 
21   
22   NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;                     //设置串口1中断
23   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
24   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
25   NVIC_Init(&NVIC_InitStructure);
26  
27 }

>_<“
硬件相关先河化函数:

void
NVIC_Configuration(void)

1 void BSP_Init(void)
2 {                                                                       
3   RCC_Configuration();             //系统时钟初始化及端口外设时钟使能      
4   NVIC_Configuration();               //中断源配置
5   GPIO_Configuration();               //状态LED1的初始化        
6   USART_Config(USART1,115200);       //串口1初始化
7   tp_Config();                       //SPI1 触摸电路初始化        
8   FSMC_LCD_Init();                   //FSMC TFT接口初始化 
9 }

617888九五至尊2 7617888九五至尊2 8

PS:BSP_Init(void)函数在BSP文件夹下的bsp.c文件里,其中饱含了和硬件相关的开头化等驱动函数,会因区其余硬件平台而各异。

 1 void USART_Config(USART_TypeDef* USARTx,u32 baud){
 2   USART_InitTypeDef USART_InitStructure;
 3   GPIO_InitTypeDef GPIO_InitStructure;
 4 
 5   //PA9,PA10 复用IO口功能用于配置串口。因此要使能AFIO(复用功能IO)时钟。
 6   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); 
 7   RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);    
 8   RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
 9   
10   //usart_init----------------------------------------------------
11   /* Configure USART1 Rx (PA.10) as input floating */
12   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
13   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;          //浮空输入模式       
14   GPIO_Init(GPIOA, &GPIO_InitStructure);                     
15   
16   /* Configure USART1 Tx (PA.09) as alternate function push-pull */
17   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
18   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
19   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;              //复用推挽输出
20   GPIO_Init(GPIOA, &GPIO_InitStructure);
21   
22   
23   USART_InitStructure.USART_BaudRate =baud;                        //速率115200bps
24   USART_InitStructure.USART_WordLength = USART_WordLength_8b;        //数据位8位
25   USART_InitStructure.USART_StopBits = USART_StopBits_1;            //停止位1位
26   USART_InitStructure.USART_Parity = USART_Parity_No;                //无校验位
27   USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;   //无硬件流控
28   USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;                    //收发模式
29 
30   /* Configure USART1 */
31   USART_Init(USARTx, &USART_InitStructure);                            //配置串口参数函数
32  
33   
34   /* Enable USART1 Receive and Transmit interrupts */
35   USART_ITConfig(USARTx, USART_IT_RXNE, ENABLE);                    //使能接收中断
36   //USART_ITConfig(USARTx, USART_IT_TXE, ENABLE);                    //使能发送缓冲空中断
37 
38   
39   /* Enable the USART1 */
40   USART_Cmd(USARTx, ENABLE);    
41 
42   //USART_ClearFlag(USARTx, USART_FLAG_TXE);     /* 清发送完成标志,Transmission Complete flag */
43 }

>_<“
App_TaskStart()主任务:

void USART_Config(USART_TypeDef*
USARTx,u32 baud)

如main函数的第22行调用的转变任务的函数:主义务的职务名为App_TaskStart,
主职分有和好的仓库, 堆栈尺寸为APP_TASK_START_STK_SIZE*4(字节),
然后执行ucosII内部函数OS提姆eSet(0),将节拍计数器清0,节拍计数器范围是0-4294967295,对于节拍频率100hz时,
每隔497天就再度计数, 调用其中函数OSStart(),启动ucosII内核, 
此时ucosII内核伊始运行。对职务表展开监视,主职分因为已经处于就绪状态,于是从头举办主义务App_TaskStart(),uCOSII的任务结构规定必须为无再次回到的结构,也就是出色循环形式。


 1 static  void App_TaskStart(void* p_arg)
 2 {
 3   (void) p_arg;
 4    //初始化ucosII时钟节拍
 5    OS_CPU_SysTickInit();                        
 6    //使能ucos 的统计任务
 7 #if (OS_TASK_STAT_EN > 0)
 8    OSStatInit();                //----统计任务初始化函数                                 
 9 #endif
10    App_TaskCreate();            //建立其他的任务
11    while (1)
12    {                    
13       OSTimeDlyHMSM(0, 0, 1, 100);
14    }
15 }

 

>_<“ 用户级子任务:

PS:相关链接

在App_TaskStart()第10行调用App_TaskCreate()建立其余子职务,依次包罗用户界面任务、触摸屏任务、串口通讯任务、LED1~3闪烁义务:

LZ
blog:http://www.cnblogs.com/zjutlitao/ 

617888九五至尊2 9617888九五至尊2 10

工程代码:http://pan.baidu.com/s/1jG850X4

 1 /****************************************************************************
 2 * 名    称:static  void App_TaskCreate(void)
 3 * 功    能:建立其余任务的函数
 4 * 入口参数:无
 5 * 出口参数:无
 6 * 说    明:
 7 * 调用方法:无 
 8 ****************************************************************************/
 9 static  void App_TaskCreate(void)
10 {
11   
12    Com1_MBOX=OSMboxCreate((void *) 0);             //建立串口1中断的邮箱
13    /*  建立用户界面任务 */
14    OSTaskCreateExt(AppTaskUserIF,                                               //指向任务代码的指针
15                        (void *)0,                                                   //任务开始执行时,传递给任务的参数的指针
16                        (OS_STK *)&AppTaskUserIFStk[APP_TASK_USER_IF_STK_SIZE-1],  //分配给任务的堆栈的栈顶指针   从顶向下递减
17                     APP_TASK_USER_IF_PRIO,                                       //分配给任务的优先级
18                     APP_TASK_USER_IF_PRIO,                                       //预备给以后版本的特殊标识符,在现行版本同任务优先级
19                     (OS_STK *)&AppTaskUserIFStk[0],                               //指向任务堆栈栈底的指针,用于堆栈的检验
20                     APP_TASK_USER_IF_STK_SIZE,                                    //指定堆栈的容量,用于堆栈的检验
21                     (void *)0,                                                    //指向用户附加的数据域的指针,用来扩展任务的任务控制块
22                     OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR);                    //选项,指定是否允许堆栈检验,是否将堆栈清0,任务是否要
23                                                                                 //进行浮点运算等等。
24                     
25    /*   建立触摸驱动任务 */
26    OSTaskCreateExt(AppTaskKbd,
27                        (void *)0,
28                     (OS_STK *)&AppTaskKbdStk[APP_TASK_KBD_STK_SIZE-1],
29                     APP_TASK_KBD_PRIO,
30                     APP_TASK_KBD_PRIO,
31                     (OS_STK *)&AppTaskKbdStk[0],
32                     APP_TASK_KBD_STK_SIZE,
33                     (void *)0,
34                     OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR);    
35    //串口1接收及发送任务---------------------------------------------------------    
36    OSTaskCreateExt(Task_Com1,(void *)0,(OS_STK *)&Task_Com1Stk[Task_Com1_STK_SIZE-1],Task_Com1_PRIO,Task_Com1_PRIO,(OS_STK *)&Task_Com1Stk[0],
37                     Task_Com1_STK_SIZE,
38                     (void *)0,
39                     OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR);
40    
41    //LED1 闪烁任务------------------------------------------------------
42    OSTaskCreateExt(Task_Led1,(void *)0,(OS_STK *)&Task_Led1Stk[Task_Led1_STK_SIZE-1],Task_Led1_PRIO,Task_Led1_PRIO,(OS_STK *)&Task_Led1Stk[0],
43                     Task_Led1_STK_SIZE,
44                     (void *)0,
45                     OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR);
46    
47    //LED2 闪烁任务------------------------------------------------------
48    OSTaskCreateExt(Task_Led2,(void *)0,(OS_STK *)&Task_Led2Stk[Task_Led2_STK_SIZE-1],Task_Led2_PRIO,Task_Led2_PRIO,(OS_STK *)&Task_Led2Stk[0],
49                     Task_Led2_STK_SIZE,
50                     (void *)0,
51                     OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR); 
52    
53    //LED3 闪烁任务------------------------------------------------------
54    OSTaskCreateExt(Task_Led3,(void *)0,(OS_STK *)&Task_Led3Stk[Task_Led3_STK_SIZE-1],Task_Led3_PRIO,Task_Led3_PRIO,(OS_STK *)&Task_Led3Stk[0],
55                     Task_Led3_STK_SIZE,
56                     (void *)0,
57                     OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR);  
58 
59 }

 

View Code

PS:6个用户职责分别有自己的堆栈空间。

617888九五至尊2 11617888九五至尊2 12

  1 /****************************************************************************
  2 * 名    称:static  void  AppTaskUserIF (void *p_arg)
  3 * 功    能:用户界面任务
  4 * 入口参数:无
  5 * 出口参数:无
  6 * 说    明:
  7 * 调用方法:无 
  8 ****************************************************************************/
  9 static  void  AppTaskUserIF (void *p_arg)
 10 {                                               
 11  (void)p_arg;                                    
 12   GUI_Init();                    //ucgui初始化 
 13   while(1) 
 14   {    
 15      Fun();                     //界面主程序
 16   }
 17 }
 18 /****************************************************************************
 19 * 名    称:static  void  AppTaskKbd (void *p_arg)
 20 * 功    能:触摸屏坐标获取任务
 21 * 入口参数:无
 22 * 出口参数:无
 23 * 说    明:
 24 * 调用方法:无 
 25 ****************************************************************************/
 26 static  void  AppTaskKbd (void *p_arg)
 27 {
 28   (void)p_arg;   
 29    while(1) 
 30    { 
 31          /* 延时10ms会读取一次触摸坐标    */
 32       OSTimeDlyHMSM(0,0,0,10);                    
 33       GUI_TOUCH_Exec();    
 34    }
 35 }
 36 /****************************************************************************
 37 * 名    称:static  void Task_Led1(void* p_arg)
 38 * 功    能:LED1闪烁任务
 39 * 入口参数:无
 40 * 出口参数:无
 41 * 说    明:
 42 * 调用方法:无 
 43 ****************************************************************************/
 44 static  void Task_Led1(void* p_arg)
 45 {
 46    
 47 
 48 
 49    (void) p_arg;        
 50    while (1)
 51    {
 52       LED_LED1_ON();
 53       OSTimeDlyHMSM(0, 0, 0, milsec1);
 54       
 55       LED_LED1_OFF();
 56       OSTimeDlyHMSM(0, 0, 0, milsec1);    
 57    }
 58 }
 59 
 60 /****************************************************************************
 61 * 名    称:static  void Task_Led2(void* p_arg)
 62 * 功    能:LED2闪烁任务
 63 * 入口参数:无
 64 * 出口参数:无
 65 * 说    明:
 66 * 调用方法:无 
 67 ****************************************************************************/
 68 static  void Task_Led2(void* p_arg)
 69 {
 70    
 71 
 72 
 73    (void) p_arg;        
 74    while (1)
 75    {
 76       LED_LED2_ON();
 77       OSTimeDlyHMSM(0, 0, 0, milsec2);
 78       
 79       LED_LED2_OFF();
 80       OSTimeDlyHMSM(0, 0, 0, milsec2);    
 81    }
 82 }
 83 
 84 /****************************************************************************
 85 * 名    称:static  void Task_Led3(void* p_arg)
 86 * 功    能:LED3闪烁任务
 87 * 入口参数:无
 88 * 出口参数:无
 89 * 说    明:
 90 * 调用方法:无 
 91 ****************************************************************************/
 92 static  void Task_Led3(void* p_arg)
 93 {
 94    
 95 
 96 
 97    (void) p_arg;        
 98    while (1)
 99    {
100       LED_LED3_ON();
101       OSTimeDlyHMSM(0, 0, 0, milsec3);
102       
103       LED_LED3_OFF();
104       OSTimeDlyHMSM(0, 0, 0, milsec3);    
105    }
106 }
107 
108 
109 /****************************************************************************
110 * 名    称:static  void Task_Com1(void *p_arg)
111 * 功    能:串口1任务
112 * 入口参数:无
113 * 出口参数:无
114 * 说    明:
115 * 调用方法:无 
116 ****************************************************************************/
117 static  void Task_Com1(void *p_arg){    
118    INT8U err;    
119    unsigned char * msg;
120    (void)p_arg;      
121    while(1){         
122       msg=(unsigned char *)OSMboxPend(Com1_MBOX,0,&err);           //等待串口接收指令成功的信号量       
123          if(msg[0]=='L'&&msg[1]==0x31){
124            milsec1=atoi(&msg[3]);                                   //LED1 的延时毫秒  (mini and V3)
125          USART_OUT(USART1,"\r\n");
126            USART_OUT(USART1,"LED1: %d ms 间隔闪烁",milsec1);         
127       }
128       else if(msg[0]=='L'&&msg[1]==0x32){
129            milsec2=atoi(&msg[3]);                                      //LED2 的延时毫秒  (only V3)
130          USART_OUT(USART1,"\r\n");
131            USART_OUT(USART1,"LED2: %d ms 间隔闪烁",milsec2);
132       }
133       else if(msg[0]=='L'&&msg[1]==0x33){
134             milsec3=atoi(&msg[3]);                                  //LED3 的延时毫秒  (only V3)
135           USART_OUT(USART1,"\r\n");
136             USART_OUT(USART1,"LED3: %d ms 间隔闪烁",milsec3);
137       } 
138    } 
139 }

View Code

PS:此处串口通讯要运用中断来拔取,并透过新闻邮箱传递新闻,若是不理解,请看上一节介绍(那里仍是可以把上一节文化说五遍,今后或许是想说都说不完啦说不完啦,亲,我们才是ucos和ucgui的开业之作吗~)

617888九五至尊2 13617888九五至尊2 14

 1 void USART1_IRQHandler(void)
 2 { 
 3     unsigned int i;
 4     unsigned char msg[50];
 5     OS_CPU_SR  cpu_sr;
 6       
 7     OS_ENTER_CRITICAL();  //保存全局中断标志,关总中断// Tell uC/OS-II that we are starting an ISR
 8       OSIntNesting++;          //用于中断嵌套     
 9       OS_EXIT_CRITICAL();      //恢复全局中断标志         
10  
11        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)       //判断读寄存器是否非空
12       {
13         msg[RxCounter1++]= USART_ReceiveData(USART1);          //将读寄存器的数据缓存到接收缓冲区里
14         if(msg[RxCounter1-1]=='L'){msg[0]='L'; RxCounter1=1;}  //判断起始标志
15         if(msg[RxCounter1-1]=='F')                             //判断结束标志是否是"F"
16         {
17               for(i=0; i< RxCounter1; i++){
18                 TxBuffer1[i]    =msg[i];                        //将接收缓冲器的数据转到发送缓冲区,准备转发
19               }
20             rec_f=1;                                           //接收成功标志
21               TxBuffer1[RxCounter1]=0;                           //接收缓冲区终止符
22               RxCounter1=0;       
23             OSMboxPost(Com1_MBOX,(void *)&msg);                        
24         }
25       } 
26       if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)                
27       { 
28          USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
29       }    
30     OSIntExit();  //在os_core.c文件里定义,如果有更高优先级的任务就绪了,则执行一次任务切换   
31 }

串口接收中断函数(在it.c文件中)


 *本节重中之重:

>_<“ :用户界面:

* 文件名: fun.c
* 内容简述:
*       
*      
 本例程图形用户接口基于ucgui3.90a,其中的MULTIEDIT窗口部件选拔了ucgui3.98的窗口部件,
*        用到的ucgui窗口部件包罗
*            TEXT
*            SLIDER
*            EDIT
*            FRAMEWIN
*            MULTIEDIT
*            本例程落成的效率有:
*      
 (1)通过界面上的滑动条控制板子上的LED1-LED3的闪耀间隔时间,范围为50-5000ms
*      
 (2)通过串口可以操纵板子上的LED1-LED3的闪光间隔时间,范围为50-5000ms。
*    扶助软件:PC机上须求周转串口调试助手软件。

地点用户级子职务中有一个是用户界面任务,在职务中直接执行函数Fun(),那里的Fun其实就是界面突显的主干函数。

1、对话框资源

 1 /* 定义了对话框资源列表 */
 2 static const GUI_WIDGET_CREATE_INFO aDialogCreate[] = {
 3   //建立窗体, 大小是800X480  原点在0,0
 4   { FRAMEWIN_CreateIndirect, "LED Flash Config", 0, 0,0,800,480,FRAMEWIN_CF_ACTIVE}, //FRAMEWIN_CF_MOVEABLE},
 5 
 6   //建立TEXT控件,起点是窗体的10,20,大小180X30  文字左对齐
 7   { TEXT_CreateIndirect,     "Led Flash Rate",  GUI_ID_TEXT3,   10,   20,  180,  30, TEXT_CF_LEFT  },
 8   
 9   //建立TEXT控件,起点是窗体的200,20,大小39X30  文字左对齐
10   { TEXT_CreateIndirect,     "ms",  GUI_ID_TEXT4,   220,   20,  39,  30, TEXT_CF_LEFT  },
11   
12   //建立EDIT控件,起点是窗体的191,60,大小47X25  文字右对齐 4个字符宽度
13   { EDIT_CreateIndirect,     "",       GUI_ID_EDIT0,    739,   60, 47,  25, EDIT_CF_RIGHT, 4 },
14   //建立EDIT控件,起点是窗体的191,110,大小47X25  文字右对齐 4个字符宽度
15   { EDIT_CreateIndirect,     "",       GUI_ID_EDIT1,    739,   110, 47,  25, EDIT_CF_RIGHT, 4 },
16   //建立EDIT控件,起点是窗体的191,160,大小47X25  文字右对齐 4个字符宽度
17   { EDIT_CreateIndirect,     "",       GUI_ID_EDIT2,   739,   160, 47,  25, EDIT_CF_RIGHT, 4 },
18 
19   //建立TEXT控件,起点是窗体的5,60,大小50X55  文字右对齐
20   { TEXT_CreateIndirect,     "Led1",  GUI_ID_TEXT0,     5,   60,  50,  55, TEXT_CF_RIGHT },
21   //建立TEXT控件,起点是窗体的5,110,大小50X105  文字右对齐
22   { TEXT_CreateIndirect,     "Led2",  GUI_ID_TEXT1,     5,   110,  50,  105, TEXT_CF_RIGHT },
23   //建立TEXT控件,起点是窗体的5,160,大小50X155  文字右对齐
24   { TEXT_CreateIndirect,     "Led3",  GUI_ID_TEXT2,     5,   160,  50,  155, TEXT_CF_RIGHT },
25   
26   //建立滑动条控件,起点是窗体的60,60,大小130X25  
27   { SLIDER_CreateIndirect,   NULL,     GUI_ID_SLIDER0,  60,  60, 650, 25, 0, 0 },
28   //建立滑动条控件,起点是窗体的60,110,大小130X25  
29   { SLIDER_CreateIndirect,   NULL,     GUI_ID_SLIDER1,  60,  110, 650, 25, 0, 0 },
30   //建立滑动条控件,起点是窗体的60,160,大小130X25  
31   { SLIDER_CreateIndirect,   NULL,     GUI_ID_SLIDER2,  60,  160, 650, 25, 0, 0 },
32 };

PS:包涵控件类型,控件名称,控件ID,地方大小等….具体参见eWin5中文手册窗口管理器那章http://pan.baidu.com/s/1mgkKVFU

2、fun函数:

  1 void Fun(void) {       
  2   unsigned char edit_cur;
  3   GUI_CURSOR_Show(); 
  4 
  5   /* 建立窗体,包含了资源列表,资源数目, 并指定回调函数 */  
  6   hWin = GUI_CreateDialogBox(aDialogCreate, GUI_COUNTOF(aDialogCreate), _cbCallback, 0, 0, 0);
  7   
  8   /* 设置窗体字体 */
  9   FRAMEWIN_SetFont(hWin, &GUI_FontComic24B_1);
 10 
 11   /* 获得TEXT 部件的句柄 */
 12   text0 = WM_GetDialogItem(hWin, GUI_ID_TEXT0);
 13   text1 = WM_GetDialogItem(hWin, GUI_ID_TEXT1);
 14   text2 = WM_GetDialogItem(hWin, GUI_ID_TEXT2);
 15   text3 = WM_GetDialogItem(hWin, GUI_ID_TEXT3);
 16   text4 = WM_GetDialogItem(hWin, GUI_ID_TEXT4);
 17     
 18   /* 获得slider部件的句柄 */            
 19   slider0 = WM_GetDialogItem(hWin, GUI_ID_SLIDER0);
 20   slider1 = WM_GetDialogItem(hWin, GUI_ID_SLIDER1);
 21   slider2 = WM_GetDialogItem(hWin, GUI_ID_SLIDER2);
 22 
 23   /* 获得edit 部件的句柄 */
 24   edit0 = WM_GetDialogItem(hWin, GUI_ID_EDIT0);  
 25   edit1 = WM_GetDialogItem(hWin, GUI_ID_EDIT1);  
 26   edit2 = WM_GetDialogItem(hWin, GUI_ID_EDIT2);
 27 
 28   /* 设置TEXT部件的字体 */            
 29   EDIT_SetFont(edit0,&GUI_FontComic18B_1);
 30   EDIT_SetFont(edit1,&GUI_FontComic18B_1);
 31   EDIT_SetFont(edit2,&GUI_FontComic18B_1);
 32 
 33   /* 设置EDIT部件采用10进制 范围50-20000*/ 
 34   EDIT_SetDecMode(edit0,milsec1,50,2000,0,0);
 35   EDIT_SetDecMode(edit1,milsec2,50,2000,0,0);
 36   EDIT_SetDecMode(edit2,milsec3,50,2000,0,0);
 37                         
 38   /* 设置TEXT部件的字体 */
 39   TEXT_SetFont(text0,pFont);
 40   TEXT_SetFont(text1,pFont);
 41   TEXT_SetFont(text2,pFont);
 42   TEXT_SetFont(text3,pFont);
 43   TEXT_SetFont(text4,pFont);    
 44   
 45   /* 设置TEXT部件的字体颜色 */            
 46   TEXT_SetTextColor(text0,GUI_WHITE);
 47   TEXT_SetTextColor(text1,GUI_WHITE);
 48   TEXT_SetTextColor(text2,GUI_WHITE);
 49   TEXT_SetTextColor(text3,GUI_WHITE);
 50   TEXT_SetTextColor(text4,GUI_WHITE);
 51 
 52   /* 设置slider部件的取值范围50-2000 */        
 53   SLIDER_SetRange(slider0,50,2000);
 54   SLIDER_SetRange(slider1,50,2000);
 55   SLIDER_SetRange(slider2,50,2000);
 56   
 57   /* 设置slider部件的值*/                    
 58   SLIDER_SetValue(slider0,milsec1);    
 59   SLIDER_SetValue(slider1,milsec2);    
 60   SLIDER_SetValue(slider2,milsec3);    
 61 
 62   /* 在窗体上建立multiedit部件*/        
 63   hmultiedit=MULTIEDIT_Create(5, 230, 790, 245, hWin, GUI_ID_MULTIEDIT0,WM_CF_SHOW, MULTIEDIT_CF_AUTOSCROLLBAR_V,
 64             "",500);
 65   /* 设置multiedit部件的字体 */        
 66   MULTIEDIT_SetFont(hmultiedit,&GUI_FontHZ_SimSun_13);
 67   /* 设置multiedit部件的背景色 */        
 68   MULTIEDIT_SetBkColor(hmultiedit,MULTIEDIT_CI_EDIT,GUI_LIGHTGRAY);
 69   /* 设置multiedit部件的字体颜色 */
 70   MULTIEDIT_SetTextColor(hmultiedit,MULTIEDIT_CI_EDIT,GUI_BLUE);
 71   /* 设置multiedit部件的文字回绕 */
 72   MULTIEDIT_SetWrapWord(hmultiedit);     
 73   /* 设置multiedit部件的最大字符数 */                    
 74   MULTIEDIT_SetMaxNumChars(hmultiedit,500);
 75   /* 设置multiedit部件的字符左对齐*/
 76   //MULTIEDIT_SetTextAlign(hmultiedit,GUI_TA_LEFT);
 77   /* 获得multiedit部件里光标位置 */            
 78   edit_cur=MULTIEDIT_GetTextSize(hmultiedit);
 79   /* 设置multiedit部件光标位置 */
 80   MULTIEDIT_SetCursorOffset(hmultiedit,edit_cur);
 81   /* 设置multiedit部件的文本内容 */
 82   //MULTIEDIT_AddText(hmultiedit,"奋斗STM32开发板LED闪烁实验");
 83   while (1)
 84   {
 85       if(rec_f==1){                                              //全局变量 rec_f 代表串口有数据接收到
 86         rec_f=0;
 87         edit_cur=MULTIEDIT_GetTextSize(hmultiedit);              //获得MULTIEDIT内容的长度
 88         if(edit_cur<500){                                       //显示区域字符长度小于500 继续添加显示
 89             MULTIEDIT_SetCursorOffset(hmultiedit,edit_cur);
 90             //MULTIEDIT_AddText(hmultiedit,&TxBuffer1[0]);      //在内容的最后增加来自于串口的新的内容
 91         }
 92         else {                                                  //显示区域字符长度大于等于500 清除显示区。继续重新显示
 93             
 94             MULTIEDIT_SetText(hmultiedit,&TxBuffer1[0]);
 95         } 
 96         if(TxBuffer1[0]=='L'&&TxBuffer1[1]==0x31){             //读取串口接收到的信息
 97               milsec1=atoi(&TxBuffer1[3]);                         //LED1 的延时毫秒  (mini and V3)
 98              SLIDER_SetValue(slider0,milsec1);                 //改变slider0的值
 99              EDIT_SetValue(edit0,milsec1);                     //改变edit0的值
100         }
101         else if(TxBuffer1[0]=='L'&&TxBuffer1[1]==0x32){         //读取串口接收到的信息
102               milsec2=atoi(&TxBuffer1[3]);                         //LED2 的延时毫秒  (mini and V3)
103              SLIDER_SetValue(slider1,milsec2);                 //改变slider1的值
104              EDIT_SetValue(edit1,milsec2);                     //改变edit1的值
105         }
106         else if(TxBuffer1[0]=='L'&&TxBuffer1[1]==0x33){         //读取串口接收到的信息
107               milsec3=atoi(&TxBuffer1[3]);                         //LED3 的延时毫秒  (mini and V3)
108              SLIDER_SetValue(slider2,milsec3);                 //改变slider2的值
109              EDIT_SetValue(edit2,milsec3);                     //改变edit3的值
110         }        
111     }
112     WM_Exec();                                                 //屏幕刷新
113   }
114 }

PS:第6行hWin =
GUI_CreateDialogBox(aDialogCreate, GUI_COUNTOF(aDialogCreate),
_cbCallback, 0, 0, 0)是用地点安装好的对话框资源建立建立窗体并点名回调函数。

PS:下边为窗体回调函数(窗口发生变换时,会自动执行这么些函数,该函数对窗体动作音讯进行分析,最终调用_OnValueChanged(hDlg, Id);
修改对应控件的值。

 1 static void _cbCallback(WM_MESSAGE * pMsg) {    
 2   int NCode, Id;
 3   WM_HWIN hDlg;
 4   hDlg = pMsg->hWin;      
 5   switch (pMsg->MsgId) {     
 6     case WM_NOTIFY_PARENT:
 7       Id    = WM_GetId(pMsg->hWinSrc);      /*获得窗体部件的ID*/
 8       NCode = pMsg->Data.v;                 /*动作代码 */
 9       switch (NCode) {              
10         case WM_NOTIFICATION_VALUE_CHANGED: /*窗体部件的值被改变 */       
11           _OnValueChanged(hDlg, Id);         
12           break;
13         default:
14           break;
15       }
16       break;  
17     default:
18       WM_DefaultProc(pMsg);
19   }
20 }

 1 static void _OnValueChanged(WM_HWIN hDlg, int Id) {
 2 
 3   if ((Id == GUI_ID_SLIDER0)) {                             //slider0 的值被改变
 4     milsec1=SLIDER_GetValue(slider0);                     //获得slider0的值
 5     EDIT_SetValue(edit0,milsec1);                         //EDIT0 的值被改变
 6   }    
 7   else if ((Id == GUI_ID_SLIDER1)) {                     //slider1 的值被改变
 8     milsec2=SLIDER_GetValue(slider1);                     //获得slider1的值
 9     EDIT_SetValue(edit1,milsec2);                         //EDIT1 的值被改变
10   }    
11   else if ((Id == GUI_ID_SLIDER2)) {                     //slider2 的值被改变
12     milsec3=SLIDER_GetValue(slider2);                     //获得slider2的值
13     EDIT_SetValue(edit2,milsec3);                         //EDIT2 的值被改变
14   }      
15 }

LZ表达及有关下载链接:

因为那边提到uCos和uC-GUI的学问太多,在此地其实说不清,上面只是流程大约过了一下,如若想深切学习,提议看邵贝贝翻译的关于uCos的书,以及eWin5华语手册或者uC-GUI_user.pdf。那里指出看英文版的uc-GUI介绍,那一个本子很全,讲的易懂~

 

相关文章

Your Comments

近期评论

    功能


    网站地图xml地图