ucosii 串口数据使用信号量接收处理

1 篇文章 0 订阅
1 篇文章 0 订阅

// 串口1信号量
OS_EVENT *sem_uart1;

// 信号的初始化

sem_uart1 = OSSemCreate(0);

使用stm32平台,下面是串口1中断函数

void USART1_IRQHandler(void)
{
    OSIntEnter();
    unsigned char clear = clear;
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
    {
        if(usart1_rx_data == 0)     //防止上一帧数据未解析完,又接收到新数据,使数组内容被更改
        {
            USART1_RX_Buffer[USART1_Number++] = USART1->DR;
            if(USART1_RX_Buffer[0] == 0x00)
            {
                USART1_Number = 0;
            }
        }
    }
    if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)
    {
        clear = USART1->SR;
        clear = USART1->DR;
        if(usart1_rx_data == 0)
        {
            usart1_rx_data = 1;
        }
        OSSemPost(sem_uart1);
    }
    OSIntExit();
}

串口1数据解析任务

void UDDataProcess_P1_task(void *pdata)
{
    //变量定义
    unsigned short i = 0;
    INT8U err = 0;
    pdata = pdata;
    for (;;)
    {
        //任务休眠
    //OSTimeDlyHMSM(0, 0, 0, UDDATA_PROCESS_P1_TASK_SLEEP_TIME);
        OSSemPend(sem_uart1, 0, &err);
        //上位机通信指令
        if ((USART1_RX_Buffer[0] == 0x4c) && (USART1_RX_Buffer[1] == 0x44))
        {
            up_device_data_parse(G_COM1, (char *)USART1_RX_Buffer, &USART1_Number);
        }
            
        //收完一帧数据将地址为置0,将数据清空
        for (i = 0; i < USART3_RXBUFFER_SIZE; i++)
            USART1_RX_Buffer[i] = 0;
                
        //收完一帧数据将地址为置0,将数据清空
        USART1_Number = 0;
        usart1_rx_data = 0;    
    }
}

用上述方法代替任务休眠方式,可以显著提高串口数据处理速度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值