当前位置: 首页 > 科技观察

OpenHarmony设备开发(三)——小熊派Nano3.1系统重现串口

时间:2023-03-12 00:17:42 科技观察

了解更多开源内容请访问:开源基础软件社区https://ost.51cto.com前言当前Nano官方提供的源码是OpenHarmony1.0,OpenHarmony2.x和3.x都为轻量级系统增加了新特性,所以想尝试为Nano板烧写OpenHarmony3.1系统(虽然新的featureemm未使用),重现串口收发demo。OpenHarmony2.x和3.x新特性:新的轻量级内核能力增强,包括文件系统增强、内核调试工具支持增强、内核模块支持可配置、三方芯片适配支持、支持ARM9架构等。轻量级增强支持图形能力,包括支持多语言字体对齐,支持显示控制轮廓,支持点阵字体,支持多芯片平台统一多后端框架等DFX能力增强支持,包括HiLog功能增强,HiEvent功能增强,提供轻量级系统信息转储工具,提供重启维侧框架等。AI能力增强支持,包括新linux内核适配支持,AI引擎支持基于共享内存的数据传输。新增轻量级分布式能力增强,支持从轻量级系统启动标准系统上的能力。增强对软总线能力的支持,为设备绑定提供认证通道传输能力。增强了对轻量级全球化功能的支持,增加了对31种语言的支持。轻量级系统增加权限属性字段及其编写接口,上层应用可以通过该字段实现相关服务。HiStreamer轻量级支持可定制媒体管道框架,Linux版本init支持热插拔,OSlightkernel&driver启动优化,快速启动能力支持。烧录准备烧录的前提是我们有3.1的源码和编译好的可烧录文件。由于在ubuntu上下载烧录工作过于繁琐,所以这次我们主要使用DevEcoDeviceTool对Hi3861芯片进行下载烧录。3.1轻量级系统源码。工具介绍HUAWEIDevEcoDeviceTool是OpenHarmony为智能终端开发者提供的一站式集成开发环境。支持OpenHarmony组件按需定制,代码编辑、编译、编程、调试,支持C/C++语言。该插件部署在VisualStudioCode上。DevEcoDeviceTool官方文档:https://device.harmonyos.com/cn/docs/documentation/guide/service_introduction-0000001050166905。具体操作首页->新建项目->选择OpenHarmonySourceCode->OpenHarmonySample->WLANConnectionProducts->确认。烧录样例本次我们将在3.1系统上重现官方Nano1.0系统中的串口UART样例。分析样例首先分析官方串口样例(因为不同系统的线程创建步骤相同,所以省略创建线程),官方串口样例主要操作是初始化串口,发送数据,以及接收数据。#include#include#include#include"ohos_init.h"#include"cmsis_os2.h"#include"wifiiot_errno.h"#include"wifiiot_gpio.h"#include"wifiiot_gpio_ex.h"#include"wifiiot_uart.h"#defineUART_TASK_STACK_SIZE1024*8#defineUART_TASK_PRIO25#defineUART_BUFF_SIZE1000staticconstchar*data="Hello,BearPi!\r\n";staticvoidUART_Task(void){uint8_tuart_buff[UART_BUFF_SIZE]={0};uint8_t*uart_buff_ptr=uart_buff;uint32_tret;//串口属性WifiIotUartAttributeuart_attr={//传输比速率:9600.baudRate=9600,//数据长度:8bits.dataBits=8,.stopBits=1,.parity=0,};//初始化串口驱动ret=UartInit(WIFI_IOT_UART_IDX_1,&uart_attr,NULL);if(ret!=WIFI_IOT_SUCCESS){printf("无法初始化uart!错误代码=%d\n",ret);返回;}printf("串口测试开始\n");while(1){printf("===========================================\r\n");printf("**************UART_example**************\r\n");printf("===========================================\r\n");//通过串口1发送数据UartWrite(WIFI_IOT_UART_IDX_1,(unsignedchar*)data,strlen(data));//通过串口1接收数据UartRead(WIFI_IOT_UART_IDX_1,uart_buff_ptr,UART_BUFF_SIZE);printf("Uart1读取数据:%s",uart_buff_ptr);usleep(1000000);}}比较头文件,我们首先要注意参考头文件.h""wifiiot_gpio.h""wifiiot_gpio_ex.h""wifiiot_uart.h",这些头文件保存在//base/iot_hardware/interfaces/kits/wifiiot_lite路径下3.1轻量级系统中的相关头文件是保存在//base/iot_hardware/peripheral/interfaces/kits。不同版本系统的头文件名称会略有不同,提供的API接口名称也会有所不同,但是通过一一对比可以发现,虽然API接口名称不同,但是最终的操作功能还是一样的,实现的目的也是一样的。比较API接口和下面比较UARTinit接口。1.0系统提供了UartInit(WifiIotUartIdxid,constWifiIotUartAttribute*param,constWifiIotUartExtraAttr*extraAttr);而3.1系统提供了IoTUartInit(unsignedintid,constIotUartAttribute*param)。可以发现这两个函数指向的操作函数hi_uart_init是相同的,如下图所示:通过对比两个版本的API接口,可以发现对应的API接口如下:1.0系统和3.1系统的API接口的UartInitIoTUartInitUartReadIoTUartReadUartWriteIoTUartWriteWifiIotUartAttributeIotUartAttributePS:3.1系统没有WifiIotUartIdx枚举。从1.1系统中的枚举可以知道(如下)我们要使用的串口序号是1,所以在接下来写代码的时候直接使用1作为串口序号。.typedefenum{/**物理端口0*/WIFI_IOT_UART_IDX_0,/**物理端口1*/WIFI_IOT_UART_IDX_1,/**物理端口2*/WIFI_IOT_UART_IDX_2,/**最大值*/WIFI_IOT_UART_IDX_MAX}WifiIotUartIdx;在这个路径下写代码在/sample/wifi-iot/app下创建源代码文件夹,在里面创建.c源文件和BUILD.gn。.c源文件:#include#include#include#include"ohos_init.h"#include"cmsis_os2.h"#include"iot_gpio.h"#include"iot_uart.h"staticconstchar*data="你好,BearPiNano!!!!!\r\n";staticvoidUART_Task(void){uint8_tuart_buff[1000]={0};uint8_t*uart_buff_ptr=uart_buff;uint32_tret;IotUartAttributeuart_attr={//baud_rate:9600.baudRate=9600,//data_bits:8bits.dataBits=8,.stopBits=1,.parity=0,};//初始化uart驱动ret=IoTUartInit(1,&uart_attr);if(ret!=0){printf("无法初始化uart!错误代码=%d\n",ret);返回;}printf("串口测试开始\n");while(1){printf("=======================================\r\n");printf("*************UART_example***************\r\n");printf("=======================================\r\n");//通过串口1发送数据IoTUartWrite(1,(unsignedchar*)data,strlen(data));(void)memset_s(uart_buff_ptr,sizeof(uart_buff_ptr),0,sizeof(uart_buff_ptr));//通过串口1接收数据IoTUartRead(1,uart_buff_ptr,1000);printf("Uart1读取数据:%s",uart_buff_ptr);睡眠(1000000);}}staticvoidUART_ExampleEntry(void){osThreadAttr_t属性;attr.name="UART_Task";属性.attr_bits=0U;属性.cb_mem=NULL;属性.cb_size=0U;属性.stack_mem=NULL;attr.stack_size=1024*8;属性优先级=25;if(osThreadNew((osThreadFunc_t)UART_Task,NULL,&attr)==NULL){printf("[ADCExample]FaliedtocreateUART_Task!\n");}}SYS_RUN(UART_ExampleEntry);BUILD.gn编译脚本:static_library("uart_example"){sources=["uart.c"]include_dirs=["//utils/native/lite/include","//kernel/liteos_m/components/cmsis/2.0","//base/iot_hardware/interfaces/kits/wifiiot_lite","//ohos_bundles/@ohos/iot_controller/interfaces/kits",]}最后修改app路径下的BUILD.gn,添加编译UART案例编译,烧录,然后按照老套路,连接Nano板,编译,burn.具体操作参考https://ost.51cto.com/posts/14773,作用是短接Nano的RX和TX,可以实现自己收发数据,和打开终端查看效果,了解更多开源内容请访问:开源基础软件社区https://ost.51cto.com。