ITPub博客

首页 > 嵌入式/内核开发 > 嵌入式/内核开发 > Hi3861 通过UART串口协议与其它开发板进行通信

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

嵌入式/内核开发 作者:OpenHarmony开发者社区 时间:2022-09-09 14:22:11 0 删除 编辑

一、搭建编译环境

1、下载虚拟机VMware和Ubuntu20.0.14

下载 VMware Workstation Pro | CN

Ubuntu系统下载 | Ubuntu

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镜像

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


    //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 = 0 U ;
   attr . cb_mem = NULL ;
   attr . cb_size = 0 U ;
   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接收引脚相连接,故需要交叉连接以保证两块开发板的正常通信。

undefined


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70011554/viewspace-2914151/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2022-05-25

  • 博文量
    287
  • 访问量
    125573