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

系统 OpenHarmony
烧录前提是我们有3.1的源码以及编译后的可烧录文件.由于ubuntu上的下载烧录工作过于繁杂,本次主要借助DevEco Device Tool工具进行下载以及烧录适用于Hi3861芯片的3.1轻量系统源码。

​想了解更多关于开源的内容,请访问:​

​51CTO 开源基础软件社区​

​https://ost.51cto.com​

前言

当前小熊派Nano官方给的源码是OpenHarmony1.0,而OpenHarmony2.x和3.x都有对轻量化系统增加了新的特性,因此想尝试一下为Nano板烧录OpenHarmony3.1的系统(虽然都没用上新特性emm),并复现串口收发demo.

【FFH】OpenHarmony设备开发(三)- 小熊派Nano3.1系统复现串口-开源基础软件社区

OpenHarmony2.x和3.x新增特性:

  • 新增轻量级内核能力增强,包括文件系统增强、内核调试工具增强支持、内核模块支持可配置、三方芯片适配支持、支持ARM9架构等。
  • 轻量级图形能力增强支持,包括支持多语言字体对齐、支持显示控件轮廓、支持点阵字体、供统一多后端框架支持多芯片平台等。
  • DFX能力增强支持,包括HiLog功能增强、HiEvent功能增强,提供轻量级系统信息dump工具、提供重启维侧框架等。
  • AI能力增强支持,包括新增linux内核适配支持、AI引擎支持基于共享内存的数据传输。
  • 新增轻量级分布式能力增强,支持从轻量级系统启动标准系统上的Ability。
  • 软总线能力增强支持,提供认证通道传输能力,用于设备绑定。
  • 轻量级全球化能力增强支持,新增31种语言支持。
  • 轻量系统上新增权限属性字段及其写入接口,上层应用可通过该字段实现相关业务。
  • HiStreamer轻量级支持可定制的媒体管线框架、Linux版本init支持热插拔、OS轻内核&驱动启动优化、快速启动能力支持。

烧录准备

烧录前提是我们有3.1的源码以及编译后的可烧录文件.由于ubuntu上的下载烧录工作过于繁杂,本次主要借助DevEco Device Tool工具进行下载以及烧录适用于Hi3861芯片的3.1轻量系统源码。

工具介绍

HUAWEI DevEco Device Tool是OpenHarmony面向智能设备开发者提供的一站式集成开发环境,支持OpenHarmony的组件按需定制,支持代码编辑、编译、烧录和调试等功能,支持C/C++语言,以插件的形式部署在Visual Studio Code上。

DevEco Device Tool官方文档:

https://device.harmonyos.com/cn/docs/documentation/guide/service_introduction-0000001050166905。

具体操作

主页->新建工程->选择OpenHarmony源码->OpenHarmony样例->WLAN连接类产品->确认。

【FFH】OpenHarmony设备开发(三)- 小熊派Nano3.1系统复现串口-开源基础软件社区

烧录样例

本次将在3.1系统上复现Nano官方1.0系统里带的串口UART样例。

分析样例

首先分析官方给出的串口样例(因为在不同系统中的线程创建步骤相同,因此省略线程创建),官方给出的串口样例主要操作是初始化串口,发送数据,接收数据。

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#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"
#define UART_TASK_STACK_SIZE 1024 * 8
#define UART_TASK_PRIO 25
#define UART_BUFF_SIZE 1000
static const char *data = "Hello, BearPi!\r\n";
static void UART_Task(void)
{
uint8_t uart_buff[UART_BUFF_SIZE] = {0};
uint8_t *uart_buff_ptr = uart_buff;
uint32_t ret;
//串口属性
WifiIotUartAttribute uart_attr = {
//传输比特率: 9600
.baudRate = 9600,

//数据长度: 8bits
.dataBits = 8,
.stopBits = 1,
.parity = 0,
};
//Initialize uart driver
ret = UartInit(WIFI_IOT_UART_IDX_1, &uart_attr, NULL);
if (ret != WIFI_IOT_SUCCESS)
{
printf("Failed to init uart! Err code = %d\n", ret);
return;
}
printf("UART Test Start\n");
while (1)
{
printf("=======================================\r\n");
printf("*************UART_example**************\r\n");
printf("=======================================\r\n");

//通过串口1发送数据
UartWrite(WIFI_IOT_UART_IDX_1, (unsigned char *)data, strlen(data));

//通过串口1接收数据
UartRead(WIFI_IOT_UART_IDX_1, uart_buff_ptr, UART_BUFF_SIZE);

printf("Uart1 read data:%s", uart_buff_ptr);
usleep(1000000);
}
}

对比头文件

我们首先关注引用头文件,小熊派官方demo引用的头文件分别是"wifiiot_errno.h" "wifiiot_gpio.h" "wifiiot_gpio_ex.h" "wifiiot_uart.h",这几个头文件都保存在//base/iot_hardware/interfaces/kits/wifiiot_lite路径下。

【FFH】OpenHarmony设备开发(三)- 小熊派Nano3.1系统复现串口-开源基础软件社区

3.1轻量系统中相关的头文件则保存在了//base/iot_hardware/peripheral/interfaces/kits。

【FFH】OpenHarmony设备开发(三)- 小熊派Nano3.1系统复现串口-开源基础软件社区

不同版本的系统的头文件名称会有略微不同,提供的API接口名称也会有所不同,但是通过一个个比对还是可以发现,虽然API接口名称不同,但最终的操作函数还是相同的,实现的目的还是相同的。

对比API接口

下面对比一下UART的init接口,1.0系统提供的是UartInit(WifiIotUartIdx id, const WifiIotUartAttribute *param, const WifiIotUartExtraAttr *extraAttr);而3.1系统提供的是IoTUartInit(unsigned int id, const IotUartAttribute *param)。

能发现这两个函数最终指向的操作函数hi_uart_init都是相同的,如下图对比:

【FFH】OpenHarmony设备开发(三)- 小熊派Nano3.1系统复现串口-开源基础软件社区

【FFH】OpenHarmony设备开发(三)- 小熊派Nano3.1系统复现串口-开源基础软件社区

通过比较两个版本的API接口,可以发现以下的API接口是对应关系:

1.0系统的API接口

3.1系统的API接口

UartInit

IoTUartInit

UartRead

IoTUartRead

UartWrite

IoTUartWrite

WifiIotUartAttribute

IotUartAttribute

PS:3.1系统中没有WifiIotUartIdx列举,我们从1.1系统中的列举(如下)可以得知,我们所要用到的串口序号为1.因此我们在接下来的编写代码中,直接用1作为串口序号使用。

typedef enum {
/** Physical port 0 */
WIFI_IOT_UART_IDX_0,
/** Physical port 1 */
WIFI_IOT_UART_IDX_1,
/** Physical port 2 */
WIFI_IOT_UART_IDX_2,
/** Maximum value */
WIFI_IOT_UART_IDX_MAX
}WifiIotUartIdx;

编写代码

在该路径applications/sample/wifi-iot/app下创建源代码文件夹,并在里面创建一个.c源文件和BUILD.gn。

.c源文件:

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include "ohos_init.h"
#include "cmsis_os2.h"
#include "iot_gpio.h"
#include "iot_uart.h"
static const char *data = "Hello, BearPi Nano!!!!!\r\n";
static void UART_Task(void)
{
uint8_t uart_buff[1000] = {0};
uint8_t *uart_buff_ptr = uart_buff;
uint32_t ret;
IotUartAttribute uart_attr = {

// baud_rate: 9600
.baudRate = 9600,
// data_bits: 8bits
.dataBits = 8,
.stopBits = 1,
.parity = 0,
};
// Initialize uart driver
ret = IoTUartInit(1, &uart_attr);
if (ret != 0)
{
printf("Failed to init uart! Err code = %d\n", ret);
return;
}
printf("UART Test Start\n");
while (1)
{
printf("=======================================\r\n");
printf("*************UART_example**************\r\n");
printf("=======================================\r\n");

//通过串口1发送数据
IoTUartWrite(1, (unsigned char *)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 read data:%s", uart_buff_ptr);
usleep(1000000);
}
}
static void UART_ExampleEntry(void)
{
osThreadAttr_t attr;
attr.name = "UART_Task";
attr.attr_bits = 0U;
attr.cb_mem = NULL;
attr.cb_size = 0U;
attr.stack_mem = NULL;
attr.stack_size = 1024 * 8;
attr.priority = 25;
if (osThreadNew((osThreadFunc_t)UART_Task, NULL, &attr) == NULL)
{
printf("[ADCExample] Falied to create UART_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案例。

【FFH】OpenHarmony设备开发(三)- 小熊派Nano3.1系统复现串口-开源基础软件社区

编译,烧录

随后就是老一套,连接Nano板,编译,烧录.具体操作可以参考 https://ost.51cto.com/posts/14773。

【FFH】OpenHarmony设备开发(三)- 小熊派Nano3.1系统复现串口-开源基础软件社区

效果

将Nano的RX和TX短接,便可实现自己的收发数据,打开终端查看效果。

【FFH】OpenHarmony设备开发(三)- 小熊派Nano3.1系统复现串口-开源基础软件社区

【FFH】OpenHarmony设备开发(三)- 小熊派Nano3.1系统复现串口-开源基础软件社区

​想了解更多关于开源的内容,请访问:​

​51CTO 开源基础软件社区​

​https://ost.51cto.com​​。

责任编辑:jianghua 来源: 51CTO开源基础软件社区
相关推荐

2022-02-11 13:49:42

Linux系统鸿蒙

2021-12-30 16:12:07

鸿蒙HarmonyOS应用

2022-01-05 20:27:45

鸿蒙HarmonyOS应用

2022-02-14 14:28:57

驱动开发鸿蒙系统

2022-04-02 20:45:04

Hi3516开发板操作系统鸿蒙

2022-10-24 14:54:29

LWIP协议鸿蒙

2022-05-31 15:27:11

CSS动画

2022-08-15 22:28:57

串口访问鸿蒙

2022-10-25 14:51:11

设备开发鸿蒙

2022-09-06 15:25:22

Wifi设备开发

2022-09-22 15:23:40

设备开发鸿蒙

2022-04-18 10:37:01

鸿蒙操作系统开发工具

2023-02-28 15:49:09

鸿蒙应用开发

2022-02-15 14:06:36

OpenHarmon操作系统鸿蒙

2023-05-16 14:49:25

鸿蒙内核移植

2024-04-09 09:34:36

鸿蒙系统烧录操作系统

2022-02-16 15:55:21

驱动调用操作系统鸿蒙

2022-05-07 16:13:59

DevEcoTool鸿蒙

2022-09-07 15:35:49

设备开发鸿蒙
点赞
收藏

51CTO技术栈公众号