写点什么

Hi3861 通过 UART 串口协议与其它开发板进行通信

  • 2022 年 9 月 09 日
    上海
  • 本文字数:2874 字

    阅读完需:约 9 分钟

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 nodejssudo apt-get install npmnode --version   //查看nodejs版本npm --version    //查看npm版本
复制代码


(2)安装 Python 编译环境

sudo apt-get install python3.8sudo apt-get install python3-pipsudo pip3 install setuptoolssudo pip3 install kconfiglib sudo pip3 install pycryptodomesudo pip3 install six --upgrade --ignore-installed sixsudo pip3 install ecdsa
复制代码


(3) 安装 SCons

python3 -m pip install sconsscons -v   //查看版本
复制代码


如图:



(4)安装 hb 工具代码测试


python3 -m pip install --user ohos-buildvim ~/.bashrc                      //设置环境变量export PATH=~/.local/bin:$PATH        //将以下命令拷贝到.bashrc文件的最后一行,保存并退出source ~/.bashrc            //更新环境变量
复制代码


执行"hb -h",有打印以下信息即表示安装成功。



(5) 安装 gcc_riscv32

下载 gcc_riscv32 镜像

https://gitee.com/link?target=https%3A%2F%2Frepo.huaweicloud.com%2Fharmonyos%2Fcompiler%2Fgcc_riscv32%2F7.3.0%2Flinux%2Fgcc_riscv32-linux-7.3.0.tar.gz


设置环境变量

将压缩包解压到根目录

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.mkCONFIG_I2C_SUPPORT=yCONFIG_PWM_SUPPORT=y

CONFIG_I2C_SUPPORT=yCONFIG_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.cDispatchConnectEvent函数下 屏蔽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 接收引脚相连接,故需要交叉连接以保证两块开发板的正常通信。



用户头像

OpenHarmony开发者官方账号 2021.12.15 加入

OpenHarmony是由开放原子开源基金会(OpenAtom Foundation)孵化及运营的开源项目,目标是面向全场景、全连接、全智能时代,基于开源的方式,搭建一个智能终端设备操作系统的框架和平台,促进万物互联产业的繁荣发展

评论

发布
暂无评论
Hi3861 通过UART串口协议与其它开发板进行通信_OpenHarmony_OpenHarmony开发者社区_InfoQ写作社区