stm32+ucosII建立串口通信等多任务的实现

发布者:JoyfulJourney最新更新时间:2019-07-25 来源: eefocus关键字:stm32  ucosII  串口通信  多任务 手机看文章 扫描二维码
随时随地手机看文章

关于ucos的知识,目前是边做项目边加深理解,感觉还是有些欠缺,希望能从自己的代码经历中能总结出精髓。个人能力有限,编写边更新,难免有误,还望轻拍.


一、mailbox还是全局变量的问题


      一般在任务间传递数据是采用mialbox,全局变量无法实现多任务按照时间片执行的目的。


设计的大概思想是:


中断接收,然后邮箱传递。目的任务去接收信息


void USART1_IRQHandler(void)


    static unsigned char msg[512];


    unsigned int i;


    OS_CPU_SR  cpu_sr;


    OS_ENTER_CRITICAL();                         /* Tell uC/OS-II that we are starting an ISR          */


    OSIntNesting++;


    OS_EXIT_CRITICAL();



    if(USART_GetITStatus(USART1, USART_IT_RXNE )==SET)

{

USART_ClearITPendingBit(USART1,USART_IT_RXNE);


msg[Usart1_RXLen] = USART_ReceiveData(USART1);


Usart1_RXLen++;


                if(Usart1_RXLen==10)


{             


Usart1_RXLen=0;


OSMboxPost(AppUsart2Mbox,(void *)&msg); //把信息发出去


}       


}


if(USART_GetFlagStatus(USART1,USART_FLAG_ORE) == SET) 

    USART_ClearFlag(USART1,USART_FLAG_ORE); //?SR 

USART_ReceiveData(USART1);


OSIntExit();                                 /* Tell uC/OS-II that we are leaving the ISR          */

}




任务执行


void Task_1_Usart1(void *p_arg)

{

    INT8U err;    

    unsigned char * msg;  

 

    (void)p_arg; 

    while(1){  


OSTimeDlyHMSM(0, 0, 0, 20);


    msg=(unsigned char *)OSMboxPend(AppUsart2Mbox,0,&err);  

    if(msg[0]=='#' )


while(TxCounter < 10)

{

USART_SendData(USART1, msg[TxCounter++]);

while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)

{}

}

TxCounter = 0;            

    } 

}


接收长度为10的字符串,字符串以#字符开始,判断完字头把数据发出。


思考:


1、如果数据长度不确定,怎么判定字符的结束。


2、如果每个字符串里面含有长度信息,乱码怎么清除长度



关键字:stm32  ucosII  串口通信  多任务 引用地址:stm32+ucosII建立串口通信等多任务的实现

上一篇:UCOS2_STM32_任务间信号量通信(一)_应用实例描述
下一篇:STM32CubeMX学习笔记——FreeRTOS_任务创建与删除

推荐阅读最新更新时间:2024-11-08 15:59

STM32驱动LCD的原理介绍
TFTLCD即薄膜晶体管液晶显示器。它与无源TN-LCD、STN-LCD的简单矩阵不同,它在液晶显示屏的每一个像素上都设置有一个薄膜晶体管(TFT),可有效地克服非选通时的串扰,使显示液晶屏的静态特性与扫描线数无关,因此大大提高了图像质量。 ▲驱动流程 01 使用FSMC驱动LCD 关于FSMC,把数据写入相应的地址,FSMC就会把地址从FSMC_A出去,写入的数据会会从FSMC_D发出去。至于片选等信号线都是自动的。读的话,直接读相应的地址,就会拿到改地址上的数据。 FSMC驱动外部SRAM时,外部SRAM的控制一般有: 地址线(如A0~A25) 数据线(如D0~D15) 写信号(WE,即WR) 读信号(OE,即RD
[单片机]
<font color='red'>STM32</font>驱动LCD的原理介绍
STM32+OLED巧妙显示汉字英文
目标:实现OLED_Print函数,可以在OLED屏幕上显示中英文和符号混合的任意字符串 汉字编码原理 ASCII码显示的原理这里不再说明,一般的OLED例程都有使用方法。下面说一下中文编码的原理。 在keil的环境使用的是GBK或者GB2312的编码方式,GBK编码汉字使用两个字节: 第一个字节为区码,第二个好像叫段码,区码是大于127的,段码不一定。 具体编码方式可以查阅资料: 下面编写一个简单的程序进行验证: int main(void) { char *s = 哈h ; int i; delay_init(); //延时函数初始化 NVIC_Configurat
[单片机]
STM32+OLED巧妙显示汉字英文
基于嵌入式WinCE与MSP430单片机多串口通信设计
摘要:在远程监控和工业自动化系统中,串口通信因其具有连接简单、使用方便、可靠性高的优点,得到越来越广泛的应用。讨论了采用WinCE嵌入式与MSP430单片机构建串口多机通信系统的问题,在分析了WinCE操作系统与MSP430单片机串口模块特性的基础上,给出了进行串口通信的总体框图,针对实际串口通信存在的问题制定串行通信协议,然后在该系统硬件基础上根据需要定制WinCE系统内核,最后实现串口通信设计。实验结果表明:该系统能够达到多串口通信的要求。 关键词:WinCE;MSP430;TCP/IP;串口通信协议 目前WinCE嵌入式与MSP430单片机在仪器仪表、工业控制、移动设备等有着广泛的应用。在很多复杂的应用场合比如多点温
[工业控制]
基于嵌入式WinCE与MSP430单片机多<font color='red'>串口通信</font>设计
STM32连续进中断问题+
STM32 有时候会不断进入中断,解决方法如下 1.串口初始化配置时,需要打开ORE 溢出中断,如下红色代码所示 void Usart_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; USART_InitTypeDef USART_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); // 开启串口时钟 GPIO_PinAFConfig
[单片机]
STM32:编写XPT2046电阻触摸屏驱动(模拟SPI)
一、环境介绍 单片机采用: STM32F103ZET6 编程软件: keil5 编程语言: C语言 编程风格: 寄存器开发. 目标芯片: XPT2046---标准SPI接口时序 二、XPT2046芯片介绍 2.1 功能 XPT2046是一颗12位的ADC芯片,可以当做普通的ADC芯片使用,但是一般都是用在电阻触摸屏上,方便定位触摸屏坐标。 图1: XPT2046内部原理图 图2:电阻触摸屏---引出的4条线就接在XPT2046的YNXNYPXP上 (XPT2046支持笔中断输出--低电平有效,这个引脚可以配置到单片机的中断脚上,或者轮询判断这个引脚状态,判断触摸屏是否已经按下) 可以单独买一个触摸屏+一个XPT2
[单片机]
<font color='red'>STM32</font>:编写XPT2046电阻触摸屏驱动(模拟SPI)
STM32定时器介绍
STM32定时器介绍 本文将介绍STM32定时器的一些基本概念性的东西,方便后面内容的理解学习。 接下来将从以下几个方面介绍:STM32定时器介绍 ①STM32定时器介绍 STM32F4共有14个定时器,按照定时器所具备的功能多少可分为3类:基本定时器、通用定时器、高级定时器; 高级定时器具有通用、基本定时器的所有功能; 从图中可以看出: 定时器的计数最大值为2^16-1; 计数类型有:向上计数模式、向下计数模式、中央对齐模式; 定时器的最大分频系数可以达到65536; DMA请求生成、捕获/比较通道、最大接口时钟视具体定时器; 下面就定时器的计数类型进行具体的介绍: “向上计数模式”:计数器从0计数到自动加载值、然后产生
[单片机]
<font color='red'>STM32</font>定时器介绍
stm32数据存储
大端模式:数据高字节保存在内存低地址,数据低字节保存在内存高地址; 小端模式:数据高字节保存在内存高地址,数据低字节保存在内存低地址; stm32默认小端存储,如下图: volatile float f = -0.1; volatile float *p = volatile uint32_t i = 0xaabbccdd; volatile uint32_t *p2 = volatile int32_t i2 = -5; volatile int32_t *p3 = &i2; 变量名 地址 值 f 0x20000000 0xBDCCCCCD p 0x20000004 0x20000000 i
[单片机]
STM32定时器输出PWM 【自用】
PWM1输出模式配置: 1.配置IO(TIM3 PA6~7 CH1 CH2 GPIO_Mode_AF_PP复用推挽输出 50Mhz速度) /*void GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; //GPIOA and GPIOB clock enable RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //GPIOA Configuration: TIM3 channel 1 and 2 as alternate function push-pull GPIO_InitStructure.
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved