Hi3861 通过UART串口协议与其它开发板进行通信
一、搭建编译环境
1、下载虚拟机VMware和Ubuntu20.0.14
下载 VMware Workstation Pro | CN
https://www.vmware.com/cn/products/workstation-pro/workstation-pro-evaluation.html
Ubuntu系统下载 | Ubuntu
https://cn.ubuntu.com/download
2、 安装vm完成后打开vm,点击创建新的虚拟机

3、选择典型点击下一步,选择下载的Ubuntu,点击下一步,创建完成后虚拟机自动安装Ubuntu

4、安装完成后获取OpenHarmony源码可参考
https://docs.openharmony.cn/pages/v3.1/zh-cn/device-dev/get-code/sourcecode-acquire.md/
5、安装编译工具
(1)安装Node.js打开Ubuntu终端输入命令安装:
sudo apt-get install nodejs
sudo apt-get install npm
node --version //查看nodejs版本
npm --version //查看npm版本
(2)安装Python编译环境
sudo apt-get install python3.8
sudo apt-get install python3-pip
sudo pip3 install setuptools
sudo pip3 install kconfiglib
sudo pip3 install pycryptodome
sudo pip3 install six --upgrade --ignore-installed six
sudo pip3 install ecdsa
(3) 安装SCons
python3 -m pip install scons
scons -v //查看版本
如图:

(4)安装hb工具代码测试
python3 -m pip install --user ohos-build
vim ~/.bashrc //设置环境变量
export PATH=~/.local/bin:$PATH //将以下命令拷贝到.bashrc文件的最后一行,保存并退出
source ~/.bashrc //更新环境变量
执行"hb -h",有打印以下信息即表示安装成功。

(5) 安装gcc_riscv32
下载gcc_riscv32镜像
设置环境变量
将压缩包解压到根目录
tar -xvf gcc_riscv32-linux-7.3.0.tar.gz -C ~ //文件名需要与下载的文件相匹配
设置环境变量。
vim ~/.bashrc //设置环境变量
export PATH=~/gcc_riscv32/bin:$PATH //将以下命令拷贝到.bashrc文件的最后一行,保存并退出
source ~/.bashrc //更新环境变量
riscv32-unknown-elf-gcc -v //显示版本号,则安装成功
6、修改usr_config.mk文件
文件在OpenHarmony源码目录下
device/hisilicon/hispark_pegasus/sdk_liteos/build/config/usr_config.mk
CONFIG_I2C_SUPPORT=y
CONFIG_PWM_SUPPORT=y
7、修改wifiservice文件夹
文件在OpenHarmony源码目录下
device/hisilicon/hispark_pegasus/hi3861_adapter/hals/communication/wifi_lite/wifiservice/source/wifi_hotspot.c
EnableHotspot函数中屏蔽如下字段
//if (SetHotspotIpConfig() != WIFI_SUCCESS) {
// return ERROR_WIFI_UNKNOWN;
//}
地址:device/hisilicon/hispark_pegasus/hi3861_adapter/hals/communication/wifi_lite/wifiservice/source/wifi_device.c
DispatchConnectEvent函数下 屏蔽StaSetWifiNetConfig相关代码行
//StaSetWifiNetConfig(HI_WIFI_EVT_CONNECTED);
//StaSetWifiNetConfig(HI_WIFI_EVT_DISCONNECTED);
二、创建项目文件夹
1、在OpenHarmony1.01版本创建一个项目demo
在源码目录下的vendor/team_x创建smart_demo
在scr里面添加我们写的代码:

2、初始化uart串口
首先我们需要创建一个初始化uart串口的程序
将GPIO0初始化为tx端,将GPIO1初始化为rx端
void UartInit(void){
RaiseLog(LOG_LEVEL_INFO,"[2022012x01] entry into UartInit");
IoTGpioInit(HAL_WIFI_IOT_IO_NAME_GPIO_0);
HalIoSetFunc(HAL_WIFI_IOT_IO_NAME_GPIO_0, WIFI_IOT_IO_FUNC_GPIO_0_UART1_TXD);
IoTGpioInit(HAL_WIFI_IOT_IO_NAME_GPIO_1);
HalIoSetFunc(HAL_WIFI_IOT_IO_NAME_GPIO_1, WIFI_IOT_IO_FUNC_GPIO_1_UART1_RXD);
hi_uart_attribute uart_attr = {
.baud_rate = UART_BAUD_RATE, /* baud_rate: 9600 */
.data_bits = UART_DATA_BITS, /* data_bits: 8bits */
.stop_bits = UART_STOP_BITS,
.parity = 0,
}
RaiseLog(LOG_LEVEL_INFO,"[2022012x01] uart_init success");
/* Initialize uart driver */
hi_u32 ret = hi_uart_init(HI_UART_IDX_1, &uart_attr, HI_NULL);
if (ret != HI_ERR_SUCCESS)
{
printf("[Dustbin_tes3]Failed to init uart! Err code = %d\n", ret);
return;
}
}
3、创建线程任务
static void *uart_demo_task(void)
{
static uint16_t countSendTimes = 0;
static uint8_t countReceiveTimes = 0;
uartController.isReadBusy = false;
printf("[Initialize uart successfully\n");
UartInit();
while (1)
{
osDelay(50);
UartReceiveMessage();//Collecting Serial Port Data
hi_sleep(SMART_BIN_SLEEP_2500MS);
}
return 0;
}
static void IotMainEntry(void)
{
osThreadAttr_t attr;
RaiseLog(LOG_LEVEL_INFO, "DATA:%s Time:%s \r\n", __FUNCTION__, __DATE__, __TIME__); // Create the IoT Main task
attr.attr_bits = 0U;
attr.cb_mem = NULL;
attr.cb_size = 0U;
attr.stack_mem = NULL
attr.stack_size = CONFIG_TASK_MAIN_STACKSIZE;
attr.priority = CONFIG_TASK_MAIN_PRIOR;
attr.name = "IoTMain";
(void) osThreadNew((osThreadFunc_t)uart_demo_task, NULL, (const osThreadAttr_t *)&attr);
return;
}
APP_FEATURE_INIT(IotMainEntry);
4、接收串口数据
static void UartReceiveMessage(void)
{
char *recData;
printf("----Listening----\n");
RaiseLog(LOG_LEVEL_INFO,"Start Listening serial port");
if (UartIsBufEmpty())
{
return;
}
if (uartController.isReadBusy)
{
return;
}
uartController.isReadBusy = true;
g_ReceivedDatalen = hi_uart_read(UART_NUM, g_uart_buff, UART_BUFF_SIZE);
if (g_ReceivedDatalen > 0)
{
printf("handleUartReceiveMessage rcvData len:%d,msg:%s.\n", g_ReceivedDatalen, g_uart_buff);
setVoiceCommand();//Setting voice Commands
memset(g_uart_buff, 0, sizeof(g_uart_buff));
g_ReceivedDatalen = 0;
}
uartController.isReadBusy = false;
}
当hi3861开发板接收到其他开发板传输的数据后,可以通过串口打印出来,对此可以写一个解析命令,对发送的字符串,执行相应的命令

注:在接线时,要将tx与另一个开发板的rx连接,因为在UART串口协议中,通过TX(发送引脚)和RX(接收引脚)进行数据传输与接收,需要将TX发送引脚与另一开发板的RX接收引脚相连接,故需要交叉连接以保证两块开发板的正常通信。


Hi3861 通过UART串口协议与其它开发板进行通信的更多相关文章
- uart串口协议
uart串口协议 /* USART Word Length ---------------------------------------------------------*/ US ...
- UART串口协议基础1
Louis kaly.liu@163.com 串口协议基础 1 串口概述 串口由收发器组成.发送器是通过TxD引脚发送串行数据,接收器是通过RxD引脚接收串行数据. 发送器和接收器都利用了一个移位寄存 ...
- 【STM32 .Net MF开发板学习-05】PC通过Modbus协议远程操控开发板
从2002年就开始接触Modbus协议,以后陆续在PLC.DOS.Windows..Net Micro Framework等系统中使用了该协议,在我以前写的一篇博文中详细记载了这一段经历,有兴趣的朋友 ...
- 使用C#应用程序与Arduino开发板进行通信
在本文中,我们将一个Arduino Pro Mini开发板连接到PC,并且使用C# Windows应用程序与其进行通信. 将硬件连接到PC是非常有利的,不仅是因为你可以发送命令以及监控状态,还可以实时 ...
- 主机 & 虚拟机 & 开发板 相互通信
@2018年7月10日 成功方法之一: 虚拟机设置为桥接模式,保证三者在同一网段,ping方式测试网络连通性OK
- RTC实时时间系统学习笔记(一)---------------UART串口
临近研三了,自己倾向于要找数字IC方面的工作,苦于教研室的项目一直都是调板子调板子调板子,真正用到FPGA的很少,,本着"工欲善其事必先利其器"的原则,在网上搜寻如何自学FPGA, ...
- S5P4418开发板介绍
网站:http://topeetboard.com 1. 控制台(console)串口使用串口线连接开发板的 COM3到PC 机的串口,如果PC 或笔记本没有串口,就需要准备一条 USB 转串口的设备 ...
- SecureCRT访问开发板linux系统
前言: 最近在用OK6410开发板跑linux系统,经常在终端上敲一些指令,无奈开发板屏幕太小用起来非常不方便,所以使用终端一款能运行在windows上的软件与开发板连接,直接在电脑上操作开发板了,这 ...
- 基于uFUN开发板的心率计(一)DMA方式获取传感器数据
前言 从3月8号收到板子,到今天算起来,uFUN到手也有两周的时间了,最近利用下班后的时间,做了个心率计,从单片机程序到上位机开发,到现在为止完成的差不多了,实现很简单,uFUN开发板外加一个Puls ...
- FTF登入tiny210开发板
配置环境一: 第一步:安装虚拟机 1)安装虚拟机+Linux12.04 2)安装FTP软件 第二步:配置超级终端(串口) 1)开 ...
随机推荐
- [软件工程] CMMI是什么?
序 能力成熟度模型集成(CMMI) 一.CMMI(能力成熟度模型集成)概述 CMMI是由美国软件工程学会(software engineering institue,简称SEI)制定的一套专门针对软件 ...
- 用BootstrapBlazor制作修改订单字段的页面
1.在Shared文件夹下新增一个razor 2.页面初始化的时候获取订单信息 准备一个名为OrderId的参数 准备重写页面初始化时的方法 改成异步的形式来重写 4.获取数据 就3行代码. 声明这个 ...
- Nebula Graph 源码解读系列 | Vol.02 详解 Validator
整体架构 Nebula Graph Query Engine 主要分为四个模块,分别是 Parser.Validator.Optimizer 和 Executor. Parser 完成对语句的词法语法 ...
- [程序] C++实现 http和https的反向代理程序
目录 前言 代理原理 http代理 https代理 实现 客户端 服务端 遇到的所有问题记录 Python对于回复不响应 接受的数据只有4字节 最终数据已经发给Python了 但是Python还是阻塞 ...
- Java 手动抛异常
1 package com.bytezero.throwable; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 impor ...
- CentOS8安装与配置jdk1.8 与远程分发复制jdk到另一个虚拟机
安装配置JDK 一.卸载系统自带的OpenJDK及相关的java文件 1.查看系统自带OpenJDK版本 命令介绍: 2.卸载java 命令介绍: 二.下载安装jdk 1.命令式安装 查看JDK软件包 ...
- CPNtools协议建模安全分析(一)
本文根据最近整理的CPNtools论文和CPNtools官网上的说明,以及参照了乌克兰敖德萨 ---国家电信研究院运输和通信部关于 电信系统协议仿真关于CPNtools的学生讲义.基于此和和自己的 ...
- JAVA 多线程---面经
线程与进程 提到进程那就要说程序,程序有指令和数据,程序从磁盘加载到内存,cpu获得指令进行执行,其中还会用到各种资源如网络资源,磁盘等.一个程序从磁盘进入内存,就是进程实例的创建. 一个程序可以有多 ...
- Python文件操作系统
[一]文件操作基本流程 # 1. 打开文件,由应用程序向操作系统发起系统调用open(...),操作系统打开该文件,对应一块硬盘空间,并返回一个文件对象赋值给一个变量f f=open('a.txt', ...
- Jetpack Compose(3) —— 状态管理
上一篇文章拿 TextField 组件举例时,提到了 State,即状态.本篇文章,即讲解 State 的相关改概念. 一.什么是状态 与其它声明式 UI 框架一样,Compose 的职责非常单纯,仅 ...