OpenEdv-开源电子网

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

ucos串口中断接收数据并发布任务信号量到指定的任务失败

[复制链接]

14

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
168
金钱
168
注册时间
2020-9-2
在线时间
41 小时
发表于 2021-4-29 15:15:01 | 显示全部楼层 |阅读模式
1金钱
ucos在串口中断中接收数据,数据接收完成后发部任务信号量到指定的任务中发现指定的任务不能接收到任务信号量,指定任务不执行!
//串口中断接收数据的函数
void USART1_IRQHandler(void)        
{
        unsigned char r;
        OS_ERR err;
        OSIntEnter();
       
        if(USART_GetFlagStatus(USART1,USART_IT_RXNE)!=RESET)
        {
                USART_ClearITPendingBit(USART1,USART_IT_RXNE);
                r=USART_ReceiveData(USART1);
                USART1_RX_BUF[USART1_REC_CNT]=r;
                USART1_REC_CNT++;
       
                if(USART1_REC_CNT>(USART1_REC_LEN-1))
                {
                        printf("数据接收完成,释放一个任务信号量到数据分析任务\r\n");
                        OSTaskSemPost((OS_TCB  *)&Analy_TaskTCB,           //目标任务
                                                        (OS_OPT   )OS_OPT_POST_NONE,        //没选项要求
                                                        (OS_ERR  *)&err);       
                        USART1_REC_CNT=0;
                }
       
        }       
        OSIntExit();               
}


///任务等待任务信号量的任务
//串口1接收数据校验
void Analy_task(void *p_arg)
{
        unsigned char check_sum;

        OS_ERR err;
        CPU_TS         ts;
        CPU_SR_ALLOC();
        p_arg = p_arg;
       
        while(1)
        {
//         
                OSTaskSemPend ((OS_TICK   )0,                     //无期限等待
                                                (OS_OPT    )OS_OPT_PEND_BLOCKING,  //如果信号量不可用就等待
                                                (CPU_TS   *)&ts,                   //获取信号量被发布的时间戳
                                                (OS_ERR   *)&err);                 //返回错误类型
//                printf("Rx_buff[0]:0x%02hhx\r\n",USART1_RX_BUF[0]);
//                printf("Rx_buff[1]:0x%02hhx\r\n",USART1_RX_BUF[1]);
//                printf("Rx_buff[2]:0x%02hhx\r\n",USART1_RX_BUF[2]);
//                printf("Rx_buff[3]:0x%02hhx\r\n",USART1_RX_BUF[3]);
//                printf("Rx_buff[4]:0x%02hhx\r\n",USART1_RX_BUF[4]);
//                printf("Rx_buff[5]:0x%02hhx\r\n",USART1_RX_BUF[5]);
//                printf("Rx_buff[6]:0x%02hhx\r\n",USART1_RX_BUF[6]);
//                printf("Rx_buff[7]:0x%02hhx\r\n",USART1_RX_BUF[7]);
//                printf("Rx_buff[8]:0x%02hhx\r\n",USART1_RX_BUF[8]);
//                printf("Rx_buff[9]:0x%02hhx\r\n",USART1_RX_BUF[9]);
//                printf("Rx_buff[8]:0x%02hhx\r\n",USART1_RX_BUF[10]);
//                printf("Rx_buff[22]:0x%02hhx\r\n",USART1_RX_BUF[22]);
                if(USART1_RX_BUF[0]==0xaa&&USART1_RX_BUF[1]==0xff)
                {
                        check_sum=USART1_RX_BUF[0]+USART1_RX_BUF[1]+USART1_RX_BUF[2]+USART1_RX_BUF[3]+USART1_RX_BUF[4]+USART1_RX_BUF[5]+USART1_RX_BUF[6]+USART1_RX_BUF[7]+
                                          USART1_RX_BUF[8]+USART1_RX_BUF[9]+USART1_RX_BUF[10]+USART1_RX_BUF[11]+USART1_RX_BUF[12]+USART1_RX_BUF[13]+USART1_RX_BUF[14]+
                                          USART1_RX_BUF[15]+USART1_RX_BUF[16]+USART1_RX_BUF[17]+USART1_RX_BUF[18]+USART1_RX_BUF[19]+USART1_RX_BUF[20]+USART1_RX_BUF[21];
                        check_sum=~check_sum;
                        check_sum=check_sum&0xff;
                        //printf("check_sum= 0x%02hhx\r",check_sum);
//                        if(USART1_RX_BUF[22]==check_sum)
//                        {
                                RecToUsart2();  
                                OSFlagPost((OS_FLAG_GRP*)&EventFlags,
                                                                 (OS_FLAGS          )USART1REC_FLAG,
                                                                 (OS_OPT          )OS_OPT_POST_FLAG_SET,
                                                     (OS_ERR*          )&err);
//                        }
//                        else
//                        {
//                                clearUsart1Buff();
//                        }
                }
                else
                {
                        clearUsart1Buff();
                }
            OSTimeDlyHMSM(0,0,0,10,OS_OPT_TIME_HMSM_STRICT,&err); //延时1s
        }
}



请问我这哪里有问题?

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

使用道具 举报

558

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
164897
金钱
164897
注册时间
2010-12-1
在线时间
2100 小时
发表于 2021-4-30 02:01:58 | 显示全部楼层
回复

使用道具 举报

5

主题

133

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1765
金钱
1765
注册时间
2015-3-13
在线时间
269 小时
发表于 2023-2-9 18:56:07 | 显示全部楼层
楼主问题解决了吗
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-6-11 05:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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