OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4382|回复: 3

关于uC/GUI自定义消息发送的问题,有点急,请大家指导

[复制链接]

17

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2012-8-23
在线时间
0 小时
发表于 2013-12-16 10:49:08 | 显示全部楼层 |阅读模式
程序需要从串口接收一包数据,解析之后开始多任务的运行。
用的是CC1100无线,并做成了串口收发的模块,通过串口就可以进行收发。
因此PC通过串口无线发送一包数据,ARM端也是通过无线接收到数据,然后串口传给ARM,因此数据处理在ARM串口中断中。
在GUI中做了一个AutoRun的按钮,按下之后开始多任务的运行,现在的要求就是通过上位机无线发送一个开始命令,就开始多任务运行。
AutoRun按钮的处理如下:
     case GUI_ID_BUTTON1:   //StartAutoRun按钮
         task_ptr=0;   //任务序列从第0个开始执行
 OSTaskResume(APP_TASK_TASKAGV2_PRIO); //恢复AGV任务
 OSTimeDly(50);
 OSTaskResume(APP_TASK_TASKAGV1_PRIO);
 break;
按下按钮,可以正常开始运行。
大致的前提情况是这个样子的。

我想了三个办法:
1.直接在串口中断处理函数中调用AutoRun的处理代码
     void USART1_IRQHandler(void)
    
           
       if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //无线接收到AGV发送的信息
   {  
 USART_ClearITPendingBit(USART1, USART_IT_RXNE);

task_ptr=0;   //任务序列从第0个开始执行
OSTaskResume(APP_TASK_TASKAGV2_PRIO); //恢复AGV任务
OSTimeDly(50);
OSTaskResume(APP_TASK_TASKAGV1_PRIO);
    }
}

不成功,没有反应,不知道是不是中断中不能调用ucos的函数?或者是卡死在终端里了?

2.模拟发送给GUI一个按下AutoRun的消息
依然是在串口中断处理函数中,加入以下语句:
  Message.MsgId = WM_NOTIFY_PARENT;
  Message.Data.v = WM_NOTIFICATION_RELEASED;
  Message.hWinSrc = GUI_ID_BUTTON1;            //AutoRun按钮
  WM_SendMessage(_hDialog[1], &Message);       //发给AutoRun按钮所在的父窗口
不成功,ARM端直接就死机了,不知道是不是模拟按键的消息不是这么发的?

3.在中断中置位一个标志位,然后发送一个消息到AutoRun按钮所在窗口,在这个消息下处理
中断中置位AutoRun_Flag标志位:AutoRun_Flag=1;
然后发送一个消息:  WM_MESSAGE Message;  
                                  Message.MsgId  = MSG_UPDATE_AGVS;
                                 WM_SendMessage(_hDialog[1], &Message);
                                 WM_InvalidateWindow(_hDialog[1]);               //这个消息是发送成功的,以前用过
在窗口回掉函数中处理:
                                          case MSG_UPDATE_AGVS:   
                                       if(AutoRun_Flag==1)
                                    {
                                    AutoRun_Flag=0;
                                    task_ptr=0;   //任务序列从第0个开始执行
                                    OSTaskResume(APP_TASK_TASKAGV2_PRIO); //恢复AGV任务
                                    OSTimeDly(50);
                                    OSTaskResume(APP_TASK_TASKAGV1_PRIO);
                                    }
依然会死机

求大神知道啊!



















正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165537
金钱
165537
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-12-16 12:51:03 | 显示全部楼层
回复 支持 反对

使用道具 举报

2

主题

12

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2012-9-11
在线时间
0 小时
发表于 2013-12-16 13:41:43 | 显示全部楼层
[
Message.MsgId = MSG_UPDATE_AGVS;//WM_NOTIFY_PARENT;
Message.Data.v = 0;//WM_NOTIFICATION_RELEASED;
//Message.hWinSrc = GUI_ID_BUTTON1;            //AutoRun按钮
WM_SendMessage(_hDialog[1], &Message);       //发给AutoRun按钮所在的父窗口
]
你发了个没用的消息 你应该发你自己定义的消息才对
WM_NOTIFICATION_RELEASED这种消息并不用你自己去发 是控件自动发送的
我有的是节操,你要么?
回复 支持 反对

使用道具 举报

17

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2012-8-23
在线时间
0 小时
 楼主| 发表于 2013-12-16 16:28:53 | 显示全部楼层
回复【3楼】lisaziho:
[
Message.MsgId = MSG_UPDATE_AGVS;//WM_NOTIFY_PARENT;
Message.Data.v = 0;//WM_NOTIFICATION_RELEASED;
//Message.hWinSrc = GUI_ID_BUTTON1;            //AutoRun按钮
WM_SendMessage(_hDialog[1], &Message);       //发给AutoRun按钮所在的父窗口
]
你发了个没用的消息 你应该发你自己定义的消息才对
WM_NOTIFICATION_RELEASED这种消息并不用你自己去发 是控件自动发送的
---------------------------------
第三种方法中我自己发了MSG_UPDATE_AGVS的消息,同时也在回掉函数中处理了,貌似是可以运行,但是ARM端就卡死了,也不知道为什么
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-14 13:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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