OpenEdv-开源电子网

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

求教串口中断UCOS中使用消息队列的问题★问题初步解决★

[复制链接]

6

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
181
金钱
181
注册时间
2012-1-9
在线时间
24 小时
发表于 2014-1-28 00:03:37 | 显示全部楼层 |阅读模式
在学习UCOS过程中,想通过串口中断将接收到的数据放到消息队列中去,编写代码如下:
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include "stdio.h"
#include "string.h"
#include "includes.h"
//设置任务堆栈大小
#define LED_STK_SIZE     64
#define LED1_STK_SIZE    64
#define LCD_STK_SIZE     64
#define KEY_STK_SIZE     64
#define START_STK_SIZE   512
//设置任务优先级
#define LED_TASK_Prio       6
#define LED1_TASK_Prio      5
#define LCD_TASK_Prio       4
#define KEY_TASK_Prio       2
#define START_TASK_Prio     10
//常量定义
#define N_MESSAGES          200
//任务堆栈
OS_STK  TASK_LED1_STK[LED_STK_SIZE];
OS_STK  TASK_LED_STK[LED1_STK_SIZE];
OS_STK  TASK_LCD_STK[LCD_STK_SIZE];
OS_STK  TASK_START_STK[START_STK_SIZE];
OS_STK  TASK_KEY_STK[KEY_STK_SIZE];
//声明信号量
OS_EVENT *Str_Q;
//声明队列
void *MsgGrp[N_MESSAGES];
//任务申明
void TaskStart(void *pdata);
void TaskLed(void *pdata);
void TaskLed1(void *pdata);
void TaskLCD(void *pdata);
void TaskKey(void *pdata);
void USART1_IRQHandler(void)                    //串口1中断服务程序
{
    u8 Res;
    OSIntEnter();
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
    {
        Res =USART_ReceiveData(USART1);//(USART1->DR);  //读取接收到的数据
        OSQPost(Str_Q,&Res);
    }
    OSIntExit();
}
int main(void)
{
    SystemInit();   //系统初始化 72M
    delay_init(72);      //延时初始化
    NVIC_Configuration();
    uart_init(9600);//串口初始化,波特率9600
    LED_Init();     //LED0,LED1端口初始化
    KEY_Init();     //KEY端口初始化
    delay_ms(500);
    OSInit();
    OSTaskCreate( TaskStart,    //task pointer
                  (void *)0,    //parameter
                  (OS_STK *)&TASK_START_STK[START_STK_SIZE-1],  //task stack top pointer
                  START_TASK_Prio );    //task priority
    OSStart();
    return 0;
}
//开始任务
void TaskStart(void * pdata)
{
    pdata = pdata;
    OS_ENTER_CRITICAL();
    Str_Q = OSQCreate(&MsgGrp[0],N_MESSAGES);//创建消息队列
    OSTaskCreate(TaskLed,   (void * )0, (OS_STK *)&TASK_LED_STK[LED_STK_SIZE-1],     LED_TASK_Prio);
    OSTaskCreate(TaskLed1,  (void * )0, (OS_STK *)&TASK_LED1_STK[LED1_STK_SIZE-1],   LED1_TASK_Prio);
    OSTaskCreate(TaskKey,   (void * )0, (OS_STK *)&TASK_KEY_STK[KEY_STK_SIZE-1],     KEY_TASK_Prio);
    OSTaskSuspend(START_TASK_Prio); //suspend but not delete
    OS_EXIT_CRITICAL();
}
//任务1
//控制DS0的亮灭.
void TaskLed(void *pdata)
{
    while(1)
    {
        LED0=!LED0;
        OSTimeDlyHMSM(0,0,0,500);
    }
}
//任务2
//控制DS1的亮灭.
void TaskLed1(void *pdata)
{
    while(1)
    {
        LED1=!LED1;
        OSTimeDlyHMSM(0,0,1,0);
    }
}
//任务3
//按键检测
void TaskKey(void *pdata)
{
    u8  *rec;
    u8  err;
    while(1)
    {
        rec = OSQPend(Str_Q,0,&err);
        printf("%c,",*rec);
        
    }
}
出现问题:使用串口助手每次发送一个字符,可以显示出来,但是连续发送时却全部显示逗号。
请原子老师和各位高手指教为谢!
//***************************************分割线*******************************************************************//
第一次修改:将任务中的局部变量改为static修饰 删除TaskKey中的OSTimeDlyHMSM(0,0,0,200);程序可以接收到数据,但是会丢帧
//***************************************分割线*******************************************************************//
第二次修改:加入OSMutex信号量对串口进行资源共享控制,还是会出现部分的丢帧现象。参考小苗开发板的环形队列,放弃OS的消息队列。代码如下:
使用串口调试助手9600的波特率 20毫秒间隔发送数据未发现丢帧现象!



实验11 UCOSII串口2.zip

1.18 MB, 下载次数: 169

实验12 UCOSII 移植小苗队列.zip

1.18 MB, 下载次数: 156

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165537
金钱
165537
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-1-28 11:12:38 | 显示全部楼层
回复【楼主位】airwolf0992:
---------------------------------
你的队列用法有误。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165537
金钱
165537
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-1-28 11:12:51 | 显示全部楼层
void *MsgGrp[N_MESSAGES];
达不到你要的要求。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

6

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
181
金钱
181
注册时间
2012-1-9
在线时间
24 小时
 楼主| 发表于 2014-1-28 11:47:31 | 显示全部楼层
回复【3楼】正点原子:

void *MsgGrp[N_MESSAGES];
达不到你要的要求。

---------------------------------
感谢原子老师指教 能否进一步讲解 谢谢 我看了任哲老师的书还有周航慈老师的书 对队列没有进一步的讲解 还请原子老师明示
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165537
金钱
165537
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-1-28 12:17:24 | 显示全部楼层
回复【4楼】airwolf0992:
---------------------------------
你可以看下我们的例程么?
我们战舰板,ucosii的例程。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

197

帖子

0

精华

高级会员

Rank: 4

积分
538
金钱
538
注册时间
2012-7-19
在线时间
63 小时
发表于 2014-2-2 16:57:44 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
这样直接就无法编译吧好像
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165537
金钱
165537
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-2-3 21:45:29 | 显示全部楼层
回复【6楼】myxiaoniao:
---------------------------------
可以啊
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

6

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
181
金钱
181
注册时间
2012-1-9
在线时间
24 小时
 楼主| 发表于 2014-2-6 22:12:08 | 显示全部楼层
回复【5楼】正点原子:

回复【4楼】airwolf0992:
---------------------------------
你可以看下我们的例程么?
我们战舰板,ucosii的例程。

---------------------------------
本人愚钝 我看了您说的教程 对于队列的使用和mini版的都是一样的 关键是在串口中断中使用队列是否有特殊的要求呢?还请老师指教
回复 支持 反对

使用道具 举报

6

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
181
金钱
181
注册时间
2012-1-9
在线时间
24 小时
 楼主| 发表于 2014-2-7 13:06:46 | 显示全部楼层
现在问题解决了一部分,我把中断和taskkey中的变量都改成static静态变量了。串口可以接收不连续的数据 比如一次发送一个字符 如果连续发送一帧数据会出现丢帧。不知道这个问题该如何解决?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165537
金钱
165537
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-2-8 17:45:02 | 显示全部楼层
回复【9楼】airwolf0992:
---------------------------------
ucOSII队列发送数据的速度跟不上串口接收的速度,导致数据丢失.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-13 20:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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