鸿蒙开发板利用串口通信的基本原理与实现

简介: 大家好,今天主要来学习一下,如何使用Hi3861通过UART串口与其它开发板进行通信方法。

第一:搭建编译环境

1、完成虚拟机和Ubuntu20.0.14搭建

下载虚拟机连接:

下载 VMware Workstation Pro | CN

Ubuntu系统下载

Ubuntu系统下载 | Ubuntu

2、安装虚拟机完成后,点击创建新的虚拟机

83ab8769a62247198e1ffcdb4603a20a.png

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

51e437bf9a93441086e337c64084d3c8.png

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   //查看版本

如图:

6a5e4a46285ced622363c222765f0b89.png

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

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

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

2c0117e15b4944b0925e2e5e979edb51.png

(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.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函数中屏蔽如下字段

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里面添加我们写的代码:

1330d01734384e2e978e64ab0e545c33.png

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开发板接收到其他开发板传输的数据后,可以通过串口打印出来,对此可以写一个解析命令,对发送的字符串,执行相应的命令9e04484f707341d99006391f1b983595.png

第三:实现现象

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

458fdfe213ea49928f72080306cad7bb.png

目录
相关文章
|
2月前
|
缓存 开发框架 JavaScript
人人都能看懂的鸿蒙 “JS 小程序” 数据绑定原理 | 解读鸿蒙源码
人人都能看懂的鸿蒙 “JS 小程序” 数据绑定原理 | 解读鸿蒙源码
|
5月前
|
人工智能 安全 开发者
中国移动APP启动鸿蒙原生应用开发,鸿蒙生态迎来通信领域民生应用
近日,在“鸿蒙生态全面合作签约暨开发启动仪式“上,中国移动通信有限公司在线营销服务中心宣布将与鸿蒙生态在技术互补、成果共享、商业共赢等方向进行合作,以共同推动鸿蒙智能化的移动开放生态业务发展,并正式启动中国移动APP鸿蒙原生应用及元服务开发。
|
Ubuntu Linux 开发工具
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(二十一)第一次写驱动程序
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(二十一)第一次写驱动程序
261 1
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(二十一)第一次写驱动程序
|
Linux 开发工具 git
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(三十)LED模板驱动程序的改造:总线设备驱动模型
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(三十)LED模板驱动程序的改造:总线设备驱动模型
220 1
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(三十)LED模板驱动程序的改造:总线设备驱动模型
|
Linux 开发工具 git
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(二十六)LED驱动程序框架
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(二十六)LED驱动程序框架
180 0
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(二十六)LED驱动程序框架
|
Linux 芯片
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(二十五)最简单的LED驱动程序
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(二十五)最简单的LED驱动程序
150 0
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(二十五)最简单的LED驱动程序
|
Linux C语言 芯片
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(二十二)LED硬件原理
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(二十二)LED硬件原理
144 0
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(二十二)LED硬件原理
|
监控 Linux 定位技术
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(十八)串口编程(下)
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(十八)串口编程
254 0
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(十八)串口编程(下)
|
移动开发 Ubuntu Unix
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(十八)串口编程(中)
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(十八)串口编程
291 0
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(十八)串口编程(中)
|
Ubuntu Linux Shell
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(十八)串口编程(上)
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(十八)串口编程
402 0
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(十八)串口编程(上)