STM32|FreeRTOS学习第一篇

之前在STM32Nano开发板开发是基于裸机开发,即自己在main方法写死循环。死循环轮流执行各个任务逻辑的方法。这样做直接简单,但是不同任务有不同优先级,对CPU响应要求不同。逻辑容易某个任务卡住了,导致别的任务也卡死。比如串口发送长数据时候。LED闪烁会停止。
【STM32|FreeRTOS学习第一篇】FreeRTOS移植源码
C#通过Winform串口配合交互的源码
本次移植花了大几天才彻底搞定。官方Demo倒是很快,然而我不想直接用官方Demo删东西搞工程,也不想用他那个目录布局。折腾工程到编译没错误搞了半天。然后把我之前裸机实现的LED、蜂鸣器、串口的功能移植花了小半天。因为创建任务时候把任务优先级和堆栈大小参数给反了。把一个小于32的任务优先级给了堆栈,造成堆栈溢出很多奇特的内存bug。
1.有调用用vTaskDelay延迟函数后就所有任务死掉的消息,然后给前后加临界保护后又正常了。

//进入临界区 taskENTER_CRITICAL(); vTaskDelay(10); //退出临界区 taskEXIT_CRITICAL();

2.延迟方法调用崩溃问题通过临界保护解决之后又碰到给串口任务多加一行代码或者少加一行代码导致所有任务卡死问题。然后我就一段段代码去了测试。发现代码留的少就可以,就算加的代码分支执行条件永远是假也会导致任务卡死。那么问题肯定不是业务运行导致异常了。猜测是内存方面问题,然后折腾STM32F10x.s汇编代码的堆栈和FreeRTOSConfig.h的配置搞了好久还是解决不了诡异现象。
3.然后求助专业嵌入式老兄宏伟给看看我代码问题。发现我创建任务把任务优先级和堆栈大小给反了。小于32的堆栈对我串口测试的复杂任务不够。然后结合编译器的编译,有时候能达到微妙的平衡。大概就像下图:
STM32|FreeRTOS学习第一篇
文章图片

OS移植第一步搞定了,感受颇深,学习了不少东西,争取把FreeRTOS搞透彻。
不依赖OS写法(不能区分任务紧急程度,难以充分利用CPU算力):
#include "delay.h" #include "led.h" #include "beep.h" #include "key.h" #include "usart.h" #include "hardware.h" #include "timer.h" #include "smg.h"//zlz的stm32学习 int main(void) { //初始化时钟 Stm32_Clock_Init(9); //初始化延时函数 delay_init(72); //死循环监听串口消息 while (1) { //LED闪烁 //蜂鸣器响 //读取串口数据 //屏幕显示 //其他 } }

所以在功能慢慢做复杂后引入任务调度是必然的。在多个嵌入式实时操作系统里我选择了学习FreeRTOS。为什么选择它呢,一是FreeRTOS是开源的,不涉及收费,真要有用时候免得有版权问题(UCOS商用收费)。二是很多芯片基本标配FreeRTOS了,很流行,资料也不少。综合选择采用FreeRTOS。三是FreeRTOS对硬件要求少,最少3kb就可以跑起来,我这个STM32Nano开发版只能说是20kb内存高配了。
首先到FreeRTOS下载源码,我下载的是最新的FreeRTOS202112.00版本
FreeRTOS官网
解压目录如下:
STM32|FreeRTOS学习第一篇
文章图片

目前先学内核,不涉及周边模块。所以-Plus先不管。下图是内核源码和示例目录。
STM32|FreeRTOS学习第一篇
文章图片

找到STM32Nano用的芯片的示例
STM32|FreeRTOS学习第一篇
文章图片

拷入FreeRTOS源码到自己工程
STM32|FreeRTOS学习第一篇
文章图片

配置OS
STM32|FreeRTOS学习第一篇
文章图片

工程目录
STM32|FreeRTOS学习第一篇
文章图片

主要实现代码
FreeRTOSConfig.h
//配置FreeRTOS的配置模式 #ifndef FREERTOS_CONFIG_H #define FREERTOS_CONFIG_H//为1时RTOS使用抢占式调度器,为0时RTOS使用协做式调度器(时间片) #define configUSE_PREEMPTION1//设置为1使用空闲钩子(Idle Hook相似于回调函数),0忽略空闲钩子。 //当RTOS调度器开始工做后,为了保证至少有一个任务在运行,空闲任务被自动建立,占用最低优先级(0优先级)。对于已经删除的RTOS任务,空闲任务能够释放分配给它们的堆栈内存。所以,在应用中应该注意,使用vTaskDelete()函数时要确保空闲任务得到必定的处理器时间。除此以外,空闲任务没有其它特殊功能,所以能够任意的剥夺空闲任务的处理器时间。 //应用程序也可能和空闲任务共享同个优先级。 //空闲任务钩子是一个函数,这个函数由用户来实现,RTOS规定了函数的名字和参数,这个函数在每一个空闲任务周期都会被调用。 //void vApplicationIdleHook(void ); #define configUSE_IDLE_HOOK0//设置为1使用时间片钩子(Tick Hook),0忽略时间片钩子。 //时间片中断能够周期性的调用一个被称为钩子函数(回调函数)的应用程序。时间片钩子函数能够很方便的实现一个定时器功能。 //只有在FreeRTOSConfig.h中的configUSE_TICK_HOOK设置成1时才可使用时间片钩子。一旦此值设置成1,就要定义钩子函数,函数名和参数以下所示 //void vApplicationTickHook( void ); #define configUSE_TICK_HOOK0//写入实际的CPU内核时钟频率,也就是CPU指令执行频率,一般称为Fcclk。配置此值是为了正确的配置系统节拍中断周期。 #define configCPU_CLOCK_HZ( ( unsigned long ) 72000000 ) //RTOS 系统节拍中断的频率。即一秒中断的次数,每次中断RTOS都会进行任务调度。 //系统节拍中断用来测量时间,所以,越高的测量频率意味着可测到越高的分辨率时间。 //可是,高的系统节拍中断频率也意味着RTOS内核占用更多的CPU时间,所以会下降效率。 //RTOS演示例程都是使用系统节拍中断频率为1000HZ,这是为了测试RTOS内核,比实际使用的要高。(实际使用时不用这么高的系统节拍中断频率) #define configTICK_RATE_HZ( ( TickType_t ) 100 )//配置应用程序有效的优先级数目。任何数量的任务均可以共享一个优先级,使用协程能够单独的给与它们优先权。 //在RTOS内核中,每一个有效优先级都会消耗必定量的RAM,所以这个值不要超过你的应用实际须要的优先级数目。 #define configMAX_PRIORITIES( 32 )//定义空闲任务使用的堆栈大小。一般此值不该小于对应处理器演示例程文件FreeRTOSConfig.h中定义的数值。 #define configMINIMAL_STACK_SIZE ( ( unsigned short ) 128 ) // RTOS内核总计可用的有效的RAM大小。仅在你使用官方下载包中附带的内存分配策略时,才有可能用到此值。 //每当建立任务、队列、互斥量、软件定时器或信号量时,RTOS内核会为此分配RAM,这里的RAM都属于configTOTAL_HEAP_SIZE指定的内存区。 //后续的内存配置会详细讲到官方给出的内存分配策略。 #define configTOTAL_HEAP_SIZE(( size_t) (17*1024))//调用任务函数时,须要设置描述任务信息的字符串,这个宏用来定义该字符串的最大长度。 //这里定义的长度包括字符串结束符’\0’ #define configMAX_TASK_NAME_LEN(16)//设置成1表示启动可视化跟踪调试,会激活一些附加的结构体成员和函数。 #define configUSE_TRACE_FACILITY 0//定义configUSE_16_BIT_TICKS为1意味着portTickType表明16位无符号整形, //定义configUSE_16_BIT_TICKS为0意味着portTickType表明32位无符号整形。 #define configUSE_16_BIT_TICKS0//为1时空闲任务放弃CPU使用权 //这个参数控制任务在空闲优先级中的行为。仅在知足下列条件后,才会起做用。 //使用抢占式内核调度 //用户任务使用空闲优先级。 #define configIDLE_SHOULD_YIELD1//设置成1表示使用协程,0表示不使用协程。若是使用协程,必须在工程中包含croutine.c文件。 //在当前嵌入式硬件环境下,不建议使用协程,FreeRTOS的开发者早已经中止开发协程。 #define configUSE_CO_ROUTINES0 // 应用程序协程(Co-routines)的有效优先级数目,任何数目的协程均可以共享一个优先级。使用协程能够单独的分配给任务优先级。 #define configMAX_CO_ROUTINE_PRIORITIES ( 2 )//加入下面这些API #define INCLUDE_vTaskPrioritySet1 #define INCLUDE_uxTaskPriorityGet1 #define INCLUDE_vTaskDelete1 #define INCLUDE_vTaskCleanUpResources 0 #define INCLUDE_vTaskSuspend1 #define INCLUDE_vTaskDelayUntil1 #define INCLUDE_vTaskDelay1//配置内核使用的中断优先级,这里是8 bit,默认最低优先级 #define configKERNEL_INTERRUPT_PRIORITY255 //配置系统所能调用管理的最高优先级191为BF,最高优先级是11,优先级0-10不归系统管理 #define configMAX_SYSCALL_INTERRUPT_PRIORITY191 /* equivalent to 0xb0, or priority 11. *///配置系统内核优先级,这里使用的是4bit优先级,所以最低为15,跟1中的配置相同 #define configLIBRARY_KERNEL_INTERRUPT_PRIORITY 15#endif

InitOS.h
//定义宏,防止头文件重复引用 #ifndef __INITOS #define __INITOS //标准IO #include //OS调度引入 #include "FreeRTOS.h" #include "task.h" #include "queue.h" //芯片头文件引入 #include "stm32f10x_it.h"//初始化硬件 void InitHardware(void); #endif

InitOS.c
#include "InitOS.h" #include "stm32f10x_nvic.h"//初始化硬件 void InitHardware(void) { //从处于预期状态的时钟开始 RCC_DeInit(); //启动HSE高速时钟 RCC_HSEConfig( RCC_HSE_ON ); //等待时钟就绪 while( RCC_GetFlagStatus( RCC_FLAG_HSERDY ) == RESET ) { } //闪存需要 2 个等待状态 *( ( unsigned long * ) 0x40022000 ) = 0x02; //HCLK=SYSCLK RCC_HCLKConfig( RCC_SYSCLK_Div1 ); //PCLK2=HCLK RCC_PCLK2Config( RCC_HCLK_Div1 ); //PCLK1=HCLK/2 RCC_PCLK1Config( RCC_HCLK_Div2 ); //PLLCLK=8MHz*9=72MHz RCC_PLLConfig( RCC_PLLSource_HSE_Div1, RCC_PLLMul_9 ); //使能PLL RCC_PLLCmd( ENABLE ); //等待PLL时钟准备就绪 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) { } //设置PLL时钟为系统时钟源 RCC_SYSCLKConfig( RCC_SYSCLKSource_PLLCLK ); //等待时钟使用系统时钟源成功 while( RCC_GetSYSCLKSource() != 0x08 ) { } //使能GPIOA,GPIOB,GPIOC,GPIOD,GPIOE,AFIO时钟 RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO, ENABLE ); //使能SPI2外设时钟 RCC_APB1PeriphClockCmd( RCC_APB1Periph_SPI2, ENABLE ); //设置向量表的基础地址 NVIC_SetVectorTable( NVIC_VectTab_FLASH, 0x0 ); //设置权限组 NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 ); //设置SysTick的时钟源 SysTick_CLKSourceConfig( SysTick_CLKSource_HCLK ); //配置串口中断优先级 NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = configLIBRARY_KERNEL_INTERRUPT_PRIORITY; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init( &NVIC_InitStructure ); }

STM32F10x.s(调整了串口中断等)
; /*****************************************************************************/ ; /* STM32F10x.s: Startup file for ST STM32F10x device series*/ ; /*****************************************************************************/ ; /* <<< Use Configuration Wizard in Context Menu >>>*/ ; /*****************************************************************************/ ; /* This file is part of the uVision/ARM development tools.*/ ; /* Copyright (c) 2005-2007 Keil Software. All rights reserved.*/ ; /* This software may only be used under the terms of a valid, current,*/ ; /* end user licence from KEIL for a compatible version of KEIL software*/ ; /* development tools. Nothing else gives you the right to use this software. */ ; /*****************************************************************************/; //Stack Configuration ; // Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> ; // Stack_SizeEQU0x0000200AREASTACK, NOINIT, READWRITE, ALIGN=3 Stack_MemSPACEStack_Size __initial_sp; //Heap Configuration ; //Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> ; // Heap_SizeEQU0x00000000AREAHEAP, NOINIT, READWRITE, ALIGN=3 __heap_base Heap_MemSPACEHeap_Size __heap_limitIMPORT xPortPendSVHandler IMPORT xPortSysTickHandler IMPORT vPortSVCHandler IMPORT vTimer2IntHandlerPRESERVE8 THUMB; Vector Table Mapped to Address 0 at ResetAREARESET, DATA, READONLY EXPORT__Vectors__VectorsDCD__initial_sp; Top of Stack DCDReset_Handler; Reset Handler DCDNMI_Handler; NMI Handler DCDHardFault_Handler; Hard Fault Handler DCDMemManage_Handler; MPU Fault Handler DCDBusFault_Handler; Bus Fault Handler DCDUsageFault_Handler; Usage Fault Handler DCD0; Reserved DCD0; Reserved DCD0; Reserved DCD0; Reserved DCDvPortSVCHandler; SVCall Handler DCDDebugMon_Handler; Debug Monitor Handler DCD0; Reserved DCDxPortPendSVHandler; PendSV Handler DCDxPortSysTickHandler; SysTick Handler; External Interrupts DCDWWDG_IRQHandler; Window Watchdog DCDPVD_IRQHandler; PVD through EXTI Line detect DCDTAMPER_IRQHandler; Tamper DCDRTC_IRQHandler; RTC DCDFLASH_IRQHandler; Flash DCDRCC_IRQHandler; RCC DCDEXTI0_IRQHandler; EXTI Line 0 DCDEXTI1_IRQHandler; EXTI Line 1 DCDEXTI2_IRQHandler; EXTI Line 2 DCDEXTI3_IRQHandler; EXTI Line 3 DCDEXTI4_IRQHandler; EXTI Line 4 DCDDMAChannel1_IRQHandler; DMA Channel 1 DCDDMAChannel2_IRQHandler; DMA Channel 2 DCDDMAChannel3_IRQHandler; DMA Channel 3 DCDDMAChannel4_IRQHandler; DMA Channel 4 DCDDMAChannel5_IRQHandler; DMA Channel 5 DCDDMAChannel6_IRQHandler; DMA Channel 6 DCDDMAChannel7_IRQHandler; DMA Channel 7 DCDADC_IRQHandler; ADC DCDUSB_HP_CAN_TX_IRQHandler; USB High Priority or CAN TX DCDUSB_LP_CAN_RX0_IRQHandler ; USB LowPriority or CAN RX0 DCDCAN_RX1_IRQHandler; CAN RX1 DCDCAN_SCE_IRQHandler; CAN SCE DCDEXTI9_5_IRQHandler; EXTI Line 9..5 DCDTIM1_BRK_IRQHandler; TIM1 Break DCDTIM1_UP_IRQHandler; TIM1 Update DCDTIM1_TRG_COM_IRQHandler; TIM1 Trigger and Commutation DCDTIM1_CC_IRQHandler; TIM1 Capture Compare DCDvTimer2IntHandler; TIM2 DCDTIM3_IRQHandler; TIM3 DCDTIM4_IRQHandler; TIM4 DCDI2C1_EV_IRQHandler; I2C1 Event DCDI2C1_ER_IRQHandler; I2C1 Error DCDI2C2_EV_IRQHandler; I2C2 Event DCDI2C2_ER_IRQHandler; I2C2 Error DCDSPI1_IRQHandler; SPI1 DCDSPI2_IRQHandler; SPI2 DCDUSART1_IRQHandler; USART1 DCDUSART2_IRQHandler; USART2 DCDUSART3_IRQHandler; USART3 DCDEXTI15_10_IRQHandler; EXTI Line 15..10 DCDRTCAlarm_IRQHandler; RTC Alarm through EXTI Line DCDUSBWakeUp_IRQHandler; USB Wakeup from suspendAREA|.text|, CODE, READONLY; Reset HandlerReset_HandlerPROC EXPORTReset_Handler[WEAK] IMPORT__main LDRR0, =__main BXR0 ENDP; Dummy Exception Handlers (infinite loops which can be modified)NMI_HandlerPROC EXPORTNMI_Handler[WEAK] B. ENDP HardFault_Handler\ PROC EXPORTHardFault_Handler[WEAK] B. ENDP MemManage_Handler\ PROC EXPORTMemManage_Handler[WEAK] B. ENDP BusFault_Handler\ PROC EXPORTBusFault_Handler[WEAK] B. ENDP UsageFault_Handler\ PROC EXPORTUsageFault_Handler[WEAK] B. ENDP SVC_HandlerPROC EXPORTSVC_Handler[WEAK] B. ENDP DebugMon_Handler\ PROC EXPORTDebugMon_Handler[WEAK] B. ENDP PendSV_HandlerPROC EXPORTPendSV_Handler[WEAK] B. ENDP SysTick_Handler PROC EXPORTSysTick_Handler[WEAK] B. ENDPDefault_Handler PROCEXPORTWWDG_IRQHandler[WEAK] EXPORTPVD_IRQHandler[WEAK] EXPORTTAMPER_IRQHandler[WEAK] EXPORTRTC_IRQHandler[WEAK] EXPORTFLASH_IRQHandler[WEAK] EXPORTRCC_IRQHandler[WEAK] EXPORTEXTI0_IRQHandler[WEAK] EXPORTEXTI1_IRQHandler[WEAK] EXPORTEXTI2_IRQHandler[WEAK] EXPORTEXTI3_IRQHandler[WEAK] EXPORTEXTI4_IRQHandler[WEAK] EXPORTDMAChannel1_IRQHandler[WEAK] EXPORTDMAChannel2_IRQHandler[WEAK] EXPORTDMAChannel3_IRQHandler[WEAK] EXPORTDMAChannel4_IRQHandler[WEAK] EXPORTDMAChannel5_IRQHandler[WEAK] EXPORTDMAChannel6_IRQHandler[WEAK] EXPORTDMAChannel7_IRQHandler[WEAK] EXPORTADC_IRQHandler[WEAK] EXPORTUSB_HP_CAN_TX_IRQHandler[WEAK] EXPORTUSB_LP_CAN_RX0_IRQHandler [WEAK] EXPORTCAN_RX1_IRQHandler[WEAK] EXPORTCAN_SCE_IRQHandler[WEAK] EXPORTEXTI9_5_IRQHandler[WEAK] EXPORTTIM1_BRK_IRQHandler[WEAK] EXPORTTIM1_UP_IRQHandler[WEAK] EXPORTTIM1_TRG_COM_IRQHandler[WEAK] EXPORTTIM1_CC_IRQHandler[WEAK] EXPORTTIM2_IRQHandler[WEAK] EXPORTTIM3_IRQHandler[WEAK] EXPORTTIM4_IRQHandler[WEAK] EXPORTI2C1_EV_IRQHandler[WEAK] EXPORTI2C1_ER_IRQHandler[WEAK] EXPORTI2C2_EV_IRQHandler[WEAK] EXPORTI2C2_ER_IRQHandler[WEAK] EXPORTSPI1_IRQHandler[WEAK] EXPORTSPI2_IRQHandler[WEAK] EXPORTUSART1_IRQHandler[WEAK] EXPORTUSART2_IRQHandler[WEAK] EXPORTUSART3_IRQHandler[WEAK] EXPORTEXTI15_10_IRQHandler[WEAK] EXPORTRTCAlarm_IRQHandler[WEAK] EXPORTUSBWakeUp_IRQHandler[WEAK]WWDG_IRQHandler PVD_IRQHandler TAMPER_IRQHandler RTC_IRQHandler FLASH_IRQHandler RCC_IRQHandler EXTI0_IRQHandler EXTI1_IRQHandler EXTI2_IRQHandler EXTI3_IRQHandler EXTI4_IRQHandler DMAChannel1_IRQHandler DMAChannel2_IRQHandler DMAChannel3_IRQHandler DMAChannel4_IRQHandler DMAChannel5_IRQHandler DMAChannel6_IRQHandler DMAChannel7_IRQHandler ADC_IRQHandler USB_HP_CAN_TX_IRQHandler USB_LP_CAN_RX0_IRQHandler CAN_RX1_IRQHandler CAN_SCE_IRQHandler EXTI9_5_IRQHandler TIM1_BRK_IRQHandler TIM1_UP_IRQHandler TIM1_TRG_COM_IRQHandler TIM1_CC_IRQHandler TIM2_IRQHandler TIM3_IRQHandler TIM4_IRQHandler I2C1_EV_IRQHandler I2C1_ER_IRQHandler I2C2_EV_IRQHandler I2C2_ER_IRQHandler SPI1_IRQHandler SPI2_IRQHandler USART1_IRQHandler USART2_IRQHandler USART3_IRQHandler EXTI15_10_IRQHandler RTCAlarm_IRQHandler USBWakeUp_IRQHandlerB.ENDPALIGN; User Initial Stack & HeapIF:DEF:__MICROLIBEXPORT__initial_sp EXPORT__heap_base EXPORT__heap_limitELSEIMPORT__use_two_region_memory EXPORT__user_initial_stackheap __user_initial_stackheapLDRR0, =Heap_Mem LDRR1, =(Stack_Mem + Stack_Size) LDRR2, = (Heap_Mem +Heap_Size) LDRR3, = Stack_Mem BXLRALIGNENDIFEND

main.c
#include "InitOS.h" #include "led.h" #include "beep.h" #include "key.h" #include "usart.h" #include "hardware.h"//任务优先级定义和栈大小定义 //主检查任务优先级为空闲任务优先级加3 //LED任务优先级和栈大小 #define LedTaskPriority(tskIDLE_PRIORITY+3) //任务的栈大小 #define LedTaskStakSize(configMINIMAL_STACK_SIZE + 50)//蜂鸣器任务优先级和栈大小 #define BeepTaskPriority(tskIDLE_PRIORITY+4) //任务的栈大小 #define BeepTaskStakSize(configMINIMAL_STACK_SIZE + 50)//串口控制任务优先级和栈大小 #define UsartTaskPriority(tskIDLE_PRIORITY+10) //任务的栈大小 #define UsartTaskStakSize(configMINIMAL_STACK_SIZE + 1500)//定时器2中断 void vTimer2IntHandler( void ) { TIM2->SR &= (u16)~((u16)0x0001); }//主函数 int main( void ) { //初始化硬件信息 InitHardware(); //初始化LED灯硬件环境 InitLedEnv(); //初始化蜂鸣器环境 InitBeepEnv(); //初始化按键 InitKeyEnv(); //初始化串口 InitUsart(72, 9600); //要注意堆栈大小 //LED0任务 xTaskCreate(LED0Task,"LED0",LedTaskStakSize,NULL,LedTaskPriority,NULL); //LED1任务 //xTaskCreate(LED1Task,"LED1",LedTaskStakSize,NULL,LedTaskPriority,NULL); //LED2任务 //xTaskCreate(LED2Task,"LED2",LedTaskStakSize,NULL,LedTaskPriority,NULL); //LED3任务 //xTaskCreate(LED3Task,"LED3",LedTaskStakSize,NULL,LedTaskPriority,NULL); //蜂鸣器任务 xTaskCreate(BeepTask,"BEEP",BeepTaskStakSize,NULL,BeepTaskPriority,NULL); //串口控制任务 xTaskCreate(UsartCmdChlTask,"USART",UsartTaskStakSize,NULL,UsartTaskPriority,NULL); //开始任务调度 vTaskStartScheduler(); return 0; }

hardware.c
#include "InitOS.h" #include "led.h" #include "beep.h" #include "key.h" #include "usart.h" #include "hardware.h" #include "string.h"//串口控制任务 //系统节拍中断的频率设置了100,一个节拍10毫秒 void UsartCmdChlTask(void *pvParameters) { //命令开始 const u8 ENQ = 0x05; //命令结束 const u8 EOT = 0x04; //命令约定从Asscii码15开始 const u8 Key0OpenCmd = 0x0F; const u8 Key0CloseCmd = 0x10; const u8 Key1OpenCmd = 0x11; const u8 Key1CloseCmd = 0x12; const u8 Key2OpenCmd = 0x13; const u8 Key2CloseCmd = 0x14; const u8 Key3OpenCmd = 0x15; const u8 Key3CloseCmd = 0x16; const u8 Key4OpenCmd = 0x17; const u8 Key4CloseCmd = 0x18; const u8 Key5OpenCmd = 0x19; const u8 Key5CloseCmd = 0x1A; const u8 Key6OpenCmd = 0x1B; const u8 Key6CloseCmd = 0x1C; const u8 Key7OpenCmd = 0x1D; const u8 Key7CloseCmd = 0x1E; const u8 BeepOpenCmd = 0x1F; const u8 BeepCloseCmd = 0x20; //检验仪器数据 const char* machData="https://www.it610.com/article/02 30 36 30 33 32 0D FF 20 52 45 53 55 4C 54 20 20 0D 21 20 30 31 31 2E 39 53 68 20 20 20 0D 22 20 30 32 2E 37 31 53 20 20 20 20 0D 23 20 30 32 32 2E 38 53 20 20 20 20 0D 24 20 30 30 2E 34 35 53 20 20 20 20 0D 25 20 30 30 33 2E 38 53 20 20 20 20 0D 28 20 30 38 2E 34 35 53 48 20 20 20 0D 29 20 30 37 31 2E 30 53 20 20 20 20 0D 2A 20 30 30 2E 31 33 53 20 20 20 20 0D 2B 20 30 30 31 2E 31 53 20 20 20 20 0D 2C 20 30 30 2E 31 35 53 20 20 20 20 0D 2D 20 30 30 31 2E 33 53 20 20 20 20 0D 2E 20 30 30 2E 30 34 53 20 20 20 20 0D 2F 20 30 30 30 2E 33 53 20 20 20 20 0D 30 20 30 30 2E 30 34 53 20 20 20 20 0D 31 20 30 30 30 2E 33 53 20 20 20 20 0D 32 20 30 34 2E 35 36 20 20 20 20 20 0D 33 20 30 31 33 2E 31 20 20 20 20 20 0D 34 20 30 33 39 2E 38 20 20 20 20 20 0D 35 20 30 30 30 38 37 20 20 20 20 20 0D 36 20 30 32 38 2E 37 20 20 20 20 20 0D 37 20 30 33 33 2E 30 20 20 20 20 20 0D 38 20 30 31 36 2E 31 20 68 20 20 20 0D 3A 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0D 40 20 30 30 32 36 33 20 20 20 20 20 0D 41 20 30 30 37 2E 39 20 20 20 20 20 0D 42 20 30 2E 32 30 39 20 20 20 20 20 0D 43 20 30 31 32 2E 35 20 20 20 20 20 0D 50 20 20 20 20 20 20 20 20 20 20 20 20 20 0D 51 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0D 52 20 20 20 20 20 0D 53 20 20 20 20 20 20 20 0D 54 20 4E 45 55 2B 0D 55 20 0D 56 20 0D 57 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 27 3D 66 AE F0 FF E5 B7 89 75 6B 64 60 5E 60 5E 5E 5F 5D 51 43 3B 35 33 31 2F 2D 2C 2A 29 28 27 26 26 25 25 25 24 24 24 23 23 23 23 23 22 21 21 21 21 21 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0D 58 20 20 20 20 20 20 20 20 20 20 20 20 21 20 20 20 20 20 20 20 20 20 21 24 29 30 3D 4B 5F 7C 98 B2 CD DF F2 FB FD FF F8 E9 DA CA B5 9D 8B 80 73 67 5B 51 4C 47 41 3B 38 34 2F 2D 2D 2A 27 26 24 23 22 22 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0D 59 20 20 20 20 20 20 20 20 20 20 20 26 34 48 63 7E A0 C2 E3 F8 FF FF FF F8 F1 EA E3 D6 CF C8 BB B4 A7 A0 92 8C 85 7E 77 77 71 6A 63 63 5C 56 56 4F 4F 48 3B 3B 34 34 2D 2D 26 26 26 26 26 26 26 26 26 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0D 5A 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25 3D 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 3F 38 35 32 31 30 2E 2C 2A 2B 29 27 27 26 26 26 25 27 23 25 24 23 24 24 23 22 23 21 22 22 22 21 22 21 21 22 21 21 20 20 21 20 21 20 20 21 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21 0D 5B 20 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 32 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 34 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 36 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 32 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 38 30 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 34 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 34 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 36 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 30 30 30 30 30 32 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 38 30 30 30 30 30 30 30 30 30 30 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 30 30 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 34 30 30 30 30 30 30 30 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 32 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 32 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 34 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 34 30 30 30 30 30 30 32 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 32 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 32 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 34 30 34 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 42 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 32 30 31 31 34 31 30 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 36 30 30 30 30 34 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 36 31 30 30 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 42 32 38 38 38 30 30 30 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 38 35 34 46 43 31 30 30 30 30 30 30 30 30 30 30 38 30 30 30 30 30 30 30 30 30 30 30 30 30 31 31 41 44 35 35 38 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 31 31 35 31 46 31 32 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 34 33 42 46 33 46 33 30 30 30 30 30 30 30 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 44 46 36 38 34 30 38 30 30 30 30 30 30 30 30 34 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 30 38 42 43 45 39 30 30 34 30 30 30 30 30 32 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 32 31 45 42 46 46 45 41 30 30 30 32 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 43 37 46 46 46 46 34 30 32 30 30 30 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 32 38 37 46 46 46 39 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 36 37 46 46 46 46 44 32 30 30 30 30 30 30 30 30 30 30 33 30 30 30 30 30 30 30 30 30 30 30 30 31 35 46 44 46 46 46 44 41 34 30 38 30 30 34 30 30 30 30 31 30 30 30 30 30 30 30 30 30 30 30 30 32 33 46 46 46 46 46 44 32 30 30 30 30 30 30 30 32 30 38 30 30 30 30 30 30 30 30 30 32 30 30 30 31 42 46 46 46 46 46 44 34 34 32 34 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 32 46 46 46 46 46 42 45 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 35 46 46 46 46 44 41 30 30 30 30 30 30 30 30 30 30 32 30 30 30 30 30 30 30 30 30 30 30 30 35 41 46 46 46 46 45 46 31 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 34 30 30 30 30 30 30 44 46 46 46 46 46 34 45 38 30 30 30 30 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 31 46 46 46 46 46 45 33 30 30 30 38 34 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 46 46 46 46 46 46 39 31 34 30 32 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 42 46 46 46 46 46 38 30 30 30 32 30 30 30 32 31 38 30 30 30 30 30 30 30 30 30 30 30 30 30 32 37 46 46 46 46 46 46 41 36 38 30 30 30 34 30 30 31 30 30 30 30 30 30 30 30 30 31 30 30 30 30 31 42 36 46 46 46 46 44 41 43 43 30 32 30 30 30 30 30 30 30 30 31 30 30 30 30 30 30 30 30 30 30 30 37 46 46 46 46 46 45 30 30 32 30 38 30 30 30 38 31 30 30 38 30 30 30 30 30 30 30 30 30 30 30 30 37 46 46 46 46 46 44 36 30 30 30 32 30 30 30 30 34 30 30 30 30 30 30 30 30 30 31 30 30 30 30 33 37 46 46 46 46 46 46 38 34 30 30 30 30 30 38 30 30 43 34 30 31 30 30 30 30 30 30 38 30 30 30 31 33 46 46 46 46 46 42 43 30 30 30 30 34 30 30 38 30 34 30 30 30 30 30 30 30 30 30 30 30 30 30 32 46 46 46 46 46 46 46 41 34 30 30 30 34 30 30 30 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 39 46 46 46 46 46 46 45 30 37 46 30 32 30 30 30 33 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 42 46 46 46 46 46 44 43 34 39 36 30 30 30 30 32 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 46 46 46 46 46 43 39 30 30 30 30 32 41 41 30 30 30 30 30 30 32 30 30 30 30 30 30 30 30 30 30 33 46 46 46 46 46 43 43 41 30 34 34 43 36 31 30 32 31 30 30 34 30 30 30 30 30 30 30 30 30 30 32 31 46 46 46 46 46 35 39 39 31 32 34 31 30 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 46 46 46 46 43 37 34 30 39 31 41 35 34 30 30 30 34 30 30 30 31 30 30 30 30 30 30 30 30 30 30 30 46 44 46 42 46 46 39 36 32 31 36 31 33 31 32 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 32 46 45 46 45 46 45 36 43 44 42 35 32 32 34 41 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 45 36 46 44 45 45 39 36 32 42 46 32 38 34 31 30 30 38 30 30 30 30 30 30 30 30 30 30 30 30 30 32 41 33 37 46 33 45 34 45 35 46 31 37 45 34 32 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 34 32 32 34 42 41 35 32 46 45 35 44 43 34 41 41 34 30 30 30 30 30 30 30 30 30 30 30 30 30 30 32 37 32 30 42 37 44 31 37 39 31 45 45 38 45 36 30 38 30 30 30 30 30 30 31 30 30 30 30 30 30 31 30 30 39 44 45 37 41 43 46 37 39 34 43 36 33 30 32 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 36 32 37 45 36 45 37 36 45 35 39 37 35 33 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 33 32 46 37 37 45 46 45 38 46 43 39 34 36 30 31 30 31 34 30 30 30 30 30 30 30 30 30 30 30 32 33 37 46 46 46 46 46 36 45 42 45 33 35 31 31 38 30 30 32 30 30 30 30 30 31 30 30 30 30 30 32 31 31 46 46 46 46 46 46 44 44 46 34 43 34 32 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 38 33 46 46 46 46 46 46 44 45 41 34 30 30 34 30 30 30 30 30 38 30 31 30 30 30 30 30 30 30 30 30 33 46 37 46 46 46 46 46 41 35 44 30 30 30 34 30 30 32 30 30 30 30 30 30 30 30 30 30 30 30 30 30 34 46 46 46 46 46 46 46 45 38 36 34 31 30 32 31 30 32 30 30 38 30 30 30 30 30 30 30 30 30 30 30 39 42 46 46 46 46 46 46 36 38 44 30 32 38 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 35 46 46 46 46 46 46 32 36 39 30 30 30 30 30 30 30 34 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 42 46 46 46 44 44 42 30 45 30 30 31 30 32 30 30 30 30 30 30 30 30 30 30 31 30 30 30 30 30 31 34 44 46 37 46 46 46 33 30 38 30 30 30 30 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 37 46 42 46 46 31 43 30 34 30 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 33 35 30 33 46 39 37 31 32 33 31 30 34 30 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 33 30 30 34 31 31 41 34 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 38 31 38 36 36 42 32 30 41 30 30 30 34 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 33 30 30 38 30 42 43 34 30 33 39 42 34 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 41 32 38 30 34 32 31 35 38 34 31 30 30 30 34 30 30 31 30 30 30 30 38 30 30 30 30 30 30 30 30 30 30 30 31 30 30 38 30 30 30 30 31 30 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0D 5D 20 30 31 32 20 30 36 37 20 31 32 30 20 30 30 30 20 30 30 30 0D 5E 20 30 32 34 20 30 34 39 0D 5F 20 30 39 38 0D 60 20 30 31 32 20 30 36 37 20 31 32 30 0D 61 20 30 32 34 20 30 32 37 20 30 35 30 20 30 33 35 20 31 31 38 20 30 33 31 20 30 37 32 20 30 37 33 20 31 30 30 20 30 37 32 20 31 30 30 20 31 31 38 20 30 32 37 20 30 36 37 20 30 35 31 20 30 30 32 20 30 30 32 20 30 30 32 0D 66 20 20 20 20 20 4C 6D 6E 65 2D 20 20 20 20 20 0D 70 20 30 31 0D 71 20 31 39 2F 31 31 2F 31 34 20 31 30 68 33 39 6D 6E 34 39 73 0D 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0D 73 20 30 30 30 30 0D 75 20 31 30 32 20 20 20 20 20 20 20 20 20 20 20 20 20 0D 76 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0D 77 20 20 20 20 20 20 20 20 20 0D 78 20 20 20 20 0D 79 20 30 0D 7B 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0D 7C 20 20 20 20 20 20 20 20 20 20 20 0D 7D 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0D 7F 20 41 42 58 20 20 20 20 20 20 20 20 20 20 20 20 20 0D 80 20 42 0D 83 20 41 42 58 0D 8B 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0D 90 20 30 31 33 38 32 20 30 31 33 30 37 20 30 31 33 39 36 20 30 31 33 37 37 20 30 31 34 32 31 20 30 31 34 36 33 20 30 31 33 31 38 20 30 31 33 39 33 20 30 31 33 37 37 20 30 31 33 39 39 20 30 31 34 34 34 20 30 31 33 34 35 20 30 38 33 34 37 20 30 38 32 37 37 0D 91 20 30 33 35 34 37 20 30 33 35 33 38 20 30 33 36 36 36 20 30 33 36 30 33 20 30 33 36 34 34 20 30 33 35 39 33 20 30 33 36 34 35 20 30 33 37 32 30 20 30 33 36 31 31 20 30 33 35 36 32 20 30 33 35 32 32 20 30 33 35 37 39 20 32 31 35 39 32 20 32 31 36 34 30 0D 92 20 30 32 30 31 35 20 30 32 30 31 35 20 30 32 30 31 35 20 30 30 30 30 30 20 30 30 30 30 30 20 30 30 30 30 30 20 30 30 30 30 30 20 30 30 30 30 30 20 30 30 30 30 30 20 30 30 30 30 30 20 30 30 30 30 30 20 30 30 30 30 30 20 30 32 30 31 35 20 30 33 36 33 36 0D 93 20 30 32 37 37 39 31 32 20 30 32 37 37 34 37 35 20 30 32 38 35 34 31 35 20 30 32 37 37 34 33 36 20 30 32 38 30 39 36 34 20 30 32 37 36 39 34 31 20 30 32 38 30 34 34 32 20 30 32 38 34 34 35 30 20 30 32 37 39 31 31 36 20 30 32 37 33 33 35 33 20 30 32 36 39 38 36 32 20 30 32 37 35 32 31 39 20 31 36 37 36 31 34 34 20 31 36 36 32 34 34 33 0D 94 20 30 32 36 31 31 20 30 32 36 36 37 20 30 32 37 31 38 20 30 32 36 34 30 20 30 32 36 36 37 20 30 32 35 39 31 20 30 32 36 32 33 20 30 32 36 36 34 20 30 32 36 30 34 20 30 32 35 39 31 20 30 32 36 32 31 20 30 32 36 34 34 20 31 35 38 39 35 20 31 35 37 34 38 0D 95 20 30 31 33 38 32 20 30 31 33 30 37 20 30 31 33 39 36 20 30 31 33 37 37 20 30 31 34 32 31 20 30 31 34 36 33 20 30 31 33 31 38 20 30 31 33 39 33 20 30 31 33 37 37 20 30 31 33 39 39 20 30 31 34 34 34 20 30 31 33 34 35 20 30 38 33 34 37 20 30 38 32 37 37 0D 96 20 30 36 30 33 38 20 30 30 30 39 33 0D A3 20 56 0D A4 20 31 0D A5 20 31 0D A6 20 31 0D A7 20 31 0D FD 20 38 38 62 38 0D 03/r/n"; //死循环监听串口消息 while (1) { //数据已经读取完到缓冲区了 if (USART_RX_BUF_HASDATA =https://www.it610.com/article/= 1) { //得到此次接收到的数据长度 u8 len = USART_RX_BUF_CUTINDEX; //printf("\r\nzlz-stm32:您发送的消息为:\r\n\r\n"); //是否开始命令 int cmdStart = 0; //开始命令的为 int cmdStartIndex = 0; //当前命令 u8 cmd; //循环发生数据 for (u8 t = 0; t < len; t++) { //ENQ开始命令 if (USART_RX_BUF[t] == ENQ) { cmdStart = 1; cmdStartIndex = t; continue; } //第2位命令 if (cmdStart == 1) { cmd = USART_RX_BUF[t]; cmdStart = 0; } //EOT开始命令 if (USART_RX_BUF[t] == EOT && (t - cmdStartIndex) == 2) { //执行命令 //开启LED0 if (cmd == Key0OpenCmd) { LED0Open(); } //关闭LED0 else if (cmd == Key0CloseCmd) { LED0Close(); } //开启LED1 else if (cmd == Key1OpenCmd) { LED1Open(); } //关闭LED1 else if (cmd == Key1CloseCmd) { LED1Close(); } //开启LED2 else if (cmd == Key2OpenCmd) { LED2Open(); } //关闭LED2 else if (cmd == Key2CloseCmd) { LED2Close(); } //开启LED3 else if (cmd == Key3OpenCmd) { LED3Open(); } //关闭LED3 else if (cmd == Key3CloseCmd) { LED3Close(); } //开启LED4 else if (cmd == Key4OpenCmd) { LED4Open(); } //关闭LED4 else if (cmd == Key4CloseCmd) { LED4Close(); } //开启LED5 else if (cmd == Key5OpenCmd) { LED5Open(); } //关闭LED5 else if (cmd == Key5CloseCmd) { LED5Close(); } //开启LED6 else if (cmd == Key6OpenCmd) { LED6Open(); } //关闭LED6 else if (cmd == Key6CloseCmd) { LED6Close(); } //开启LED7 else if (cmd == Key7OpenCmd) { LED7Open(); } //关闭LED7 else if (cmd == Key7CloseCmd) { LED7Close(); } //开启蜂鸣器 else if (cmd == BeepOpenCmd) { BeepOpen(); } //关闭蜂鸣器 else if (cmd == BeepCloseCmd) { BeepClose(); } printf("收到命令:"); USART1->DR = cmd; //等待发送结束 while ((USART1->SR & 0X40) == 0); printf("\r\n"); } } //设置为读取完成状态 USART_RX_BUF_HASDATA = https://www.it610.com/article/0; } //得到按键值 int key = GetPressKey(0); //按了KEY if (key>= 0) { if (key == 0) { printf("KEY0\r\n"); } else if (key == 1) { printf("KEY1\r\n"); } else if (key == 2) { printf("KEY2\r\n"); } else if (key == 3) { GPIOC->ODR |= 1 << 0; //响一声 BeepOpen(); //延迟 vTaskDelay(10); BeepClose(); //用用u8格式发送字符串 U8Send(machData); vTaskDelay(10); //发送仪器数据 //printf(machData); printf("zlz\r\n"); } } //延迟 vTaskDelay(10); } }//是否已经初始化LED int LED_IS_INIT = 0; //是否已经初始化蜂鸣器 int BEEP_IS_INIT = 0; //打开LED0 void LED0Open(void) { //检查并初始化 if (LED_IS_INIT == 0) { //初始化LED灯 InitLedEnv(); LED_IS_INIT = 1; } //1左移当前索引位数后取非再做且运算就是把当前位数的电平设置低位。比如i=2即LED2,00000100取非之后为11111011再和ODR的值与运算 //第3位电平设置低,其他不变 GPIOC->ODR &= ~(1 << 0); }//关闭LED0 void LED0Close(void) { //检查并初始化 if (LED_IS_INIT == 0) { //初始化LED灯 InitLedEnv(); LED_IS_INIT = 1; } //1左移当前索引位数再做或运算就是把当前位数的电平设置高位。比如i=2即LED2,ODR寄存器值和00000100或运算 //第3位电平设置高,其他不变 GPIOC->ODR |= 1 << 0; }//打开LED1 void LED1Open(void) { //检查并初始化 if (LED_IS_INIT == 0) { //初始化LED灯 InitLedEnv(); LED_IS_INIT = 1; } //1左移当前索引位数后取非再做且运算就是把当前位数的电平设置低位。比如i=2即LED2,00000100取非之后为11111011再和ODR的值与运算 //第3位电平设置低,其他不变 GPIOC->ODR &= ~(1 << 1); }//关闭LED1 void LED1Close(void) { //检查并初始化 if (LED_IS_INIT == 0) { //初始化LED灯 InitLedEnv(); LED_IS_INIT = 1; } //1左移当前索引位数再做或运算就是把当前位数的电平设置高位。比如i=2即LED2,ODR寄存器值和00000100或运算 //第3位电平设置高,其他不变 GPIOC->ODR |= 1 << 1; }//打开LED2 void LED2Open(void) { //检查并初始化 if (LED_IS_INIT == 0) { //初始化LED灯 InitLedEnv(); LED_IS_INIT = 1; } //1左移当前索引位数后取非再做且运算就是把当前位数的电平设置低位。比如i=2即LED2,00000100取非之后为11111011再和ODR的值与运算 //第3位电平设置低,其他不变 GPIOC->ODR &= ~(1 << 2); }//关闭LED2 void LED2Close(void) { //检查并初始化 if (LED_IS_INIT == 0) { //初始化LED灯 InitLedEnv(); LED_IS_INIT = 1; } //1左移当前索引位数再做或运算就是把当前位数的电平设置高位。比如i=2即LED2,ODR寄存器值和00000100或运算 //第3位电平设置高,其他不变 GPIOC->ODR |= 1 << 2; }//打开LED3 void LED3Open(void) { //检查并初始化 if (LED_IS_INIT == 0) { //初始化LED灯 InitLedEnv(); LED_IS_INIT = 1; } //1左移当前索引位数后取非再做且运算就是把当前位数的电平设置低位。比如i=2即LED2,00000100取非之后为11111011再和ODR的值与运算 //第3位电平设置低,其他不变 GPIOC->ODR &= ~(1 << 3); }//关闭LED3 void LED3Close(void) { //检查并初始化 if (LED_IS_INIT == 0) { //初始化LED灯 InitLedEnv(); LED_IS_INIT = 1; } //1左移当前索引位数再做或运算就是把当前位数的电平设置高位。比如i=2即LED2,ODR寄存器值和00000100或运算 //第3位电平设置高,其他不变 GPIOC->ODR |= 1 << 3; }//打开LED4 void LED4Open(void) { //检查并初始化 if (LED_IS_INIT == 0) { //初始化LED灯 InitLedEnv(); LED_IS_INIT = 1; } //1左移当前索引位数后取非再做且运算就是把当前位数的电平设置低位。比如i=2即LED2,00000100取非之后为11111011再和ODR的值与运算 //第3位电平设置低,其他不变 GPIOC->ODR &= ~(1 << 4); }//关闭LED4 void LED4Close(void) { //检查并初始化 if (LED_IS_INIT == 0) { //初始化LED灯 InitLedEnv(); LED_IS_INIT = 1; } //1左移当前索引位数再做或运算就是把当前位数的电平设置高位。比如i=2即LED2,ODR寄存器值和00000100或运算 //第3位电平设置高,其他不变 GPIOC->ODR |= 1 << 4; }//打开LED5 void LED5Open(void) { //检查并初始化 if (LED_IS_INIT == 0) { //初始化LED灯 InitLedEnv(); LED_IS_INIT = 1; } //1左移当前索引位数后取非再做且运算就是把当前位数的电平设置低位。比如i=2即LED2,00000100取非之后为11111011再和ODR的值与运算 //第3位电平设置低,其他不变 GPIOC->ODR &= ~(1 << 5); }//关闭LED5 void LED5Close(void) { //检查并初始化 if (LED_IS_INIT == 0) { //初始化LED灯 InitLedEnv(); LED_IS_INIT = 1; } //1左移当前索引位数再做或运算就是把当前位数的电平设置高位。比如i=2即LED2,ODR寄存器值和00000100或运算 //第3位电平设置高,其他不变 GPIOC->ODR |= 1 << 5; }//打开LED6 void LED6Open(void) { //检查并初始化 if (LED_IS_INIT == 0) { //初始化LED灯 InitLedEnv(); LED_IS_INIT = 1; } //1左移当前索引位数后取非再做且运算就是把当前位数的电平设置低位。比如i=2即LED2,00000100取非之后为11111011再和ODR的值与运算 //第3位电平设置低,其他不变 GPIOC->ODR &= ~(1 << 6); }//关闭LED6 void LED6Close(void) { //检查并初始化 if (LED_IS_INIT == 0) { //初始化LED灯 InitLedEnv(); LED_IS_INIT = 1; } //1左移当前索引位数再做或运算就是把当前位数的电平设置高位。比如i=2即LED2,ODR寄存器值和00000100或运算 //第3位电平设置高,其他不变 GPIOC->ODR |= 1 << 6; }//打开LED7 void LED7Open(void) { //检查并初始化 if (LED_IS_INIT == 0) { //初始化LED灯 InitLedEnv(); LED_IS_INIT = 1; } //1左移当前索引位数后取非再做且运算就是把当前位数的电平设置低位。比如i=2即LED2,00000100取非之后为11111011再和ODR的值与运算 //第3位电平设置低,其他不变 GPIOC->ODR &= ~(1 << 7); }//关闭LED7 void LED7Close(void) { //检查并初始化 if (LED_IS_INIT == 0) { //初始化LED灯 InitLedEnv(); LED_IS_INIT = 1; } //1左移当前索引位数再做或运算就是把当前位数的电平设置高位。比如i=2即LED2,ODR寄存器值和00000100或运算 //第3位电平设置高,其他不变 GPIOC->ODR |= 1 << 7; }//打开fengmingq void BeepOpen(void) { //检查并初始化 if (BEEP_IS_INIT == 0) { //初始化蜂鸣器 InitBeepEnv(); BEEP_IS_INIT = 1; } //通过操作ODR寄存器设置9位置为0即低电平,响 GPIOB->ODR &= ~(1 << 8); }//关闭蜂鸣器 void BeepClose(void) { //检查并初始化 if (BEEP_IS_INIT == 0) { //初始化蜂鸣器 InitBeepEnv(); BEEP_IS_INIT = 1; } //通过操作ODR寄存器设置9位置为1即高电平,不响 GPIOB->ODR |= 1 << 8; }//把字符串按u8发送 //str:字符串 void U8Send(const char * str) { int len=strlen(str); for(int i=0; iDR = oneHex; //等待发送结束 while ((USART1->SR & 0X40) == 0); } } }//把十六进制字符串转换数组 //c:字符串 int HexToInt(char c) { if(c=='0') { return 0; } else if(c=='1') { return 1; } else if(c=='2') { return 2; } else if(c=='3') { return 3; } else if(c=='4') { return 4; } else if(c=='5') { return 5; } else if(c=='6') { return 6; } else if(c=='7') { return 7; } else if(c=='8') { return 8; } else if(c=='9') { return 9; } else if(c=='A') { return 10; } else if(c=='B') { return 11; } else if(c=='C') { return 12; } else if(c=='D') { return 13; } else if(c=='E') { return 14; } else if(c=='F') { return 15; } return 16; }

    推荐阅读