一、搭建编译环境
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终端输入命令安装:
1 2 3 4 5 | sudo apt- get install nodejs sudo apt- get install npm node --version //查看nodejs版本 npm --version //查看npm版本 |
(2)安装Python编译环境
1 2 3 4 5 6 7 8 | 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
1 2 3 | python3 -m pip install scons scons -v //查看版本 |
如图:
(4)安装hb工具代码测试
1 2 3 4 5 | python3 -m pip install --user ohos-build vim ~/.bashrc //设置环境变量 export PATH=~/.local/bin:$PATH //将以下命令拷贝到.bashrc文件的最后一行,保存并退出 source ~/.bashrc //更新环境变量 |
执行"hb -h",有打印以下信息即表示安装成功。
(5) 安装gcc_riscv32
下载gcc_riscv32镜像
设置环境变量
将压缩包解压到根目录
1 2 3 4 5 6 7 | 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
1 2 3 | 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
1 2 3 4 5 6 7 8 9 | 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端
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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、创建线程任务
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | 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、接收串口数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | 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接收引脚相连接,故需要交叉连接以保证两块开发板的正常通信。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析