0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

鸿蒙开发板上实现TCP电子琴

OpenHarmony技术社区 来源:OST开源开发者 2023-05-15 09:33 次阅读

本文实现了用润和 HiHope Pegasus 3861 开发板实现 TCP 电子琴。

2e8b8474-f29d-11ed-90ce-dac502259ad0.png

样例运行的 OpenHarmony 源码环境下载

https://gitee.com/HiSpark/hi3861_hdu_iot_application
通过本文您将了解:

HiHopePegasus 3861 开发环境选择

HiHopePegasus 3861 连接 wifi

HiHopePegasus 3861 TCP 连接

HiHopePegasus 3861 环境监测板上蜂鸣器的控制

TCP电子琴样例运行效果

3861 开发板作为 TCP 服务端与 TCP 客户端(自己的设备)连接。

TCP 客户端发送 12345678,控制开发板上环境拓展板上的蜂鸣器发出 duō lái mī fā suō lā xī duō 8 种音调。

样例运行步骤

①下载源文件

https://gitee.com/from-north-to-north/open-armony-north/tree/master/润和3861轻量系统TCP电子琴

将源文件文件放置在命名为 TCP_keyboard_demo 的文件夹下,将其放置在 OpenHarmony 轻量系统源码 applicationssamplewifi-iotapp 目录下。

②修改 net_params.h 文件的相关代码

如下:

PARAM_HOTSPOT_SSID 设置为要连接的热点名称

PARAM_HOTSPOT_PSK 设置为要连接的热点秘码

PARAM_SERVER_ADDR 设置为要连接的作为 TCP 客户端的设备 IP 地址

PARAM_SERVER_PORT 设置 3861开发板(作为 TCP 服务端) TCP socket端口

③在源码 applicationssamplewifi-iotappBUILD.gn 文件 features 字段下添加"TCP_keyboard_demo:TCP_keyboard_demo",使样例 demo 加入编译。

④根据 3861 开发板的 ip(串口打印出来的)和 net_params.h 中填写的 TCP socket 端口号创建客户端,连接 3861 开发板。

2f11b256-f29d-11ed-90ce-dac502259ad0.png

主控芯片对应关系

环境监测板上蜂鸣器与主控芯片(Pegasus)引脚的对应关系:GPIO9/PWM0。

源码分析

文件说明:

2f46dde6-f29d-11ed-90ce-dac502259ad0.png

tcp_server_test.c 文件解析:

#include
#include
#include

#include

//TCP连接的部分
#include"net_demo.h"
#include"net_common.h"

/********************环境监测板上蜂鸣器的部分*********************************/
#include"iot_gpio.h"
#include"iot_pwm.h"
#include"hi_pwm.h"
#include"hi_io.h"
#defineBEEP_PIN_NAME9
#defineBEEP_PIN_FUNCTION5
#defineWIFI_IOT_PWM_PORT_PWM00
#defineBEEP_PWM_DUTY50

/*********************************************************************/

#defineDELAY_1S(1)

voidTcpServerTest(unsignedshortport)
{

/********************环境监测板上蜂鸣器的部分*********************************/
//初始化蜂鸣器
//蜂鸣器:GPIO9/PWM0
//环境监测板上蜂鸣器与主控芯片(Pegasus)引脚的对应关系GPIO9/PWM0
//IoTGpioInit用于初始化GPIO设备
IoTGpioInit(BEEP_PIN_NAME);
//hi_io_set_func用于配置某个IO的复用功能
hi_io_set_func(BEEP_PIN_NAME,BEEP_PIN_FUNCTION);
//IoTGpioSetDir用于设置GPIO引脚的方向
IoTGpioSetDir(BEEP_PIN_NAME,IOT_GPIO_DIR_OUT);
//IoTPwmInit用于初始化PWM设备
IoTPwmInit(WIFI_IOT_PWM_PORT_PWM0);

/***************************************************************************************/

ssize_tretval=0;
intbacklog=1;
intsockfd=socket(AF_INET,SOCK_STREAM,0);//TCPsocket
intconnfd=-1;

structsockaddr_inclientAddr={0};
socklen_tclientAddrLen=sizeof(clientAddr);
structsockaddr_inserverAddr={0};
serverAddr.sin_family=AF_INET;
serverAddr.sin_port=htons(port);//端口号,从主机字节序转为网络字节序
serverAddr.sin_addr.s_addr=htonl(INADDR_ANY);//允许任意主机接入,0.0.0.0

/*************************************绑定端口****************************************************/
retval=bind(sockfd,(structsockaddr*)&serverAddr,sizeof(serverAddr));
if(retval< 0) {
        printf("_______________________________________
");
        printf("bind failed, %ld!
", retval);

        //关闭socket
        printf("do_cleanup...
");
        close(sockfd);
    }else{
    printf("_______________________________________
");
    printf("bind to port %hu success!
", port);
    }

/***********************************************************************************************/

    retval = listen(sockfd, backlog); // 开始监听
    if (retval < 0) {
        printf("_______________________________________
");
        printf("listen failed!
");

        //关闭socket
        printf("do_cleanup...
");
        close(sockfd);
    }else{
    printf("_______________________________________
");
    printf("listen with %d backlog success!
", backlog);
    }

/**************************************接受客户端连接*********************************************************/

    // 接受客户端连接,成功会返回一个表示连接的 socket , clientAddr 参数将会携带客户端主机和端口信息 ;失败返回 -1
    // 此后的 收、发 都在 表示连接的 socket 上进行;之后 sockfd 依然可以继续接受其他客户端的连接,
    //  UNIX系统上经典的并发模型是“每个连接一个进程”——创建子进程处理连接,父进程继续接受其他客户端的连接
    //  鸿蒙liteos-a内核之上,可以使用UNIX的“每个连接一个进程”的并发模型
    //     liteos-m内核之上,可以使用“每个连接一个线程”的并发模型
    connfd = accept(sockfd, (struct sockaddr *)&clientAddr, &clientAddrLen);
    if (connfd < 0) {
        printf("accept failed, %d, %d
", connfd, errno);

        //关闭socket
        printf("do_cleanup...
");
        close(sockfd);
    }else{
    printf("_______________________________________
");
    printf("accept success, connfd = %d!
", connfd);
    printf("client addr info: host = %s, port = %hu
", inet_ntoa(clientAddr.sin_addr), ntohs(clientAddr.sin_port));
    }

/***********************************socket收、发的部分************************************************************/

  // 后续 收、发 都在 表示连接的 socket 上进行;
    while (1) {
       char request[128] = "";
       //接收客户端发送过来的数据
       retval = recv(connfd, request, sizeof(request), 0);
       if (retval < 0) {
           printf("_______________________________________
");
           printf("recv request failed, %ld!
", retval);

           //关闭与客户端的连接
           printf("do_disconnect...
");
           sleep(DELAY_1S);
           close(connfd);
           sleep(DELAY_1S); // for debug
        }else{
           printf("_______________________________________
");
           printf("The data received from the client is %s 
", request);
        }

        //发送数据到客户端
        retval = send(connfd, request, strlen(request), 0);
        if (retval <= 0) {
           printf("_______________________________________
");
           printf("send response failed, %ld!
", retval);

           //关闭与客户端的连接
           printf("do_disconnect...
");
           sleep(DELAY_1S);
           close(connfd);
           sleep(DELAY_1S); // for debug
        }else{
           printf("The data responsed to the client is %s
", request);
        }

/************************tcp 客户端发送12345678控制不同的音调****************************/
      int i=atoi(request); // 将字符串request转换成int类型
      hi_pwm_set_clock(PWM_CLK_XTAL); // 设置时钟源为晶体时钟(40MHz,默认时钟源160MHz)
        switch (i)
        {
         case 1:
          printf("Tone is 1
" );

        /**
          * IoTPwmStart 根据给定的输出频率和占空比启动指定端口的 PWM 信号输出。
          * - port 指示 PWM 设备的端口号
          * - 占空比 表示 PWM 信号输出的占空比。值范围为 1 到 99。
          * - 频率 指示 PWM 信号输出的频率。
        **/
          IoTPwmStart(WIFI_IOT_PWM_PORT_PWM0, BEEP_PWM_DUTY, 2500);  //通过调节PWM 信号输出的频率控制蜂鸣器声调(调到2000听不到蜂鸣器声音)
          usleep(500000);//音长
          IoTPwmStop(WIFI_IOT_PWM_PORT_PWM0);
          break;  

         case 2:
          printf("Tone is 2
");
          IoTPwmStart(WIFI_IOT_PWM_PORT_PWM0, BEEP_PWM_DUTY, 3000);
          usleep(500000);//音长
          IoTPwmStop(WIFI_IOT_PWM_PORT_PWM0);
          break;    

         case 3:

          printf("Tone is 3
");
          IoTPwmStart(WIFI_IOT_PWM_PORT_PWM0, BEEP_PWM_DUTY, 3500);
          usleep(500000);//音长
          IoTPwmStop(WIFI_IOT_PWM_PORT_PWM0);
          break;

         case 4:
          printf("Tone is 3
");
          IoTPwmStart(WIFI_IOT_PWM_PORT_PWM0, BEEP_PWM_DUTY, 4000);
          usleep(500000);//音长
          IoTPwmStop(WIFI_IOT_PWM_PORT_PWM0);
          break;

         case 5:
          printf("Tone is 5
");
          IoTPwmStart(WIFI_IOT_PWM_PORT_PWM0, BEEP_PWM_DUTY, 4500);
          usleep(500000);//音长
          IoTPwmStop(WIFI_IOT_PWM_PORT_PWM0);
          break;

         case 6:
          printf("Tone is 6
");
          IoTPwmStart(WIFI_IOT_PWM_PORT_PWM0, BEEP_PWM_DUTY, 5000);
          usleep(500000);//音长
          IoTPwmStop(WIFI_IOT_PWM_PORT_PWM0);
          break;

         case 7:
          printf("Tone is 7
");
          IoTPwmStart(WIFI_IOT_PWM_PORT_PWM0, BEEP_PWM_DUTY, 5500);
          usleep(500000);//音长
          IoTPwmStop(WIFI_IOT_PWM_PORT_PWM0);
          break;

       case 8:
          printf("Tone is 8
");
          IoTPwmStart(WIFI_IOT_PWM_PORT_PWM0, BEEP_PWM_DUTY, 6000);
          usleep(500000);//音长
          IoTPwmStop(WIFI_IOT_PWM_PORT_PWM0);
          break;

         default:break;
        }
/***********************************************************************************************/

       usleep(10);
    }

/***********************************************************************************************/

}

SERVER_TEST_DEMO(TcpServerTest);

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • TCP
    TCP
    +关注

    关注

    8

    文章

    1348

    浏览量

    78978
  • 开发板
    +关注

    关注

    25

    文章

    4933

    浏览量

    97157
  • 电子琴
    +关注

    关注

    4

    文章

    152

    浏览量

    30457
  • 鸿蒙
    +关注

    关注

    57

    文章

    2306

    浏览量

    42728
  • HiHope
    +关注

    关注

    0

    文章

    63

    浏览量

    3533

原文标题:鸿蒙开发板上实现TCP电子琴

文章出处:【微信号:gh_834c4b3d87fe,微信公众号:OpenHarmony技术社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    [求助]我电脑声音想输出到电子琴,能不能直接把耳机线接到电子琴喇叭,具体怎么

    我电脑声音想输出到电子琴,能不能直接把耳机线接到电子琴喇叭,具体怎么做,请详细给我说下!(相当于把电子琴当个音箱)这个
    发表于 06-03 23:23

    简易电子琴仿真

    我用555定时器做了一个简单的电子琴 有八个音节 但是声音出不来 有哪位高人有简易电子琴的proteus仿真啊
    发表于 05-25 11:35

    电子琴节拍

    有那位高手知道用51做的电子琴的节拍怎么确定啊,急求。。。
    发表于 06-28 22:57

    电子琴设计

    电子琴设计
    发表于 08-19 12:01 250次下载

    电子琴实验

    电子琴实验 一. 实验目的利用实验仪提供的按键K1~K7 作为电子琴按键,控制蜂鸣器发声,使用户了解计算机发声原理,熟悉定
    发表于 09-22 10:48 3772次阅读
    <b class='flag-5'>电子琴</b>实验

    使用FPGA DIY开发板控制实现电子琴演奏功能

    wang1113的电子琴视频。
    的头像 发表于 06-22 00:58 3176次阅读

    FPGA DIY开发板控制电子琴

    haohaolinux 的电子琴视频 。
    的头像 发表于 06-20 16:00 3659次阅读

    如何基于51单片机做简易的电子琴详细资料合集免费下载

    本文档的主要内容详细介绍的是基于51开发板做的简易电子琴的详细资料合集
    发表于 07-24 08:00 14次下载
    如何基于51单片机做简易的<b class='flag-5'>电子琴</b>详细资料合集免费下载

    基于555的简易电子琴设计

    偶尔玩两下电子琴也是不错的
    的头像 发表于 08-15 17:43 1.8w次阅读

    使用单片机实现智能电子琴的设计资料合集

    本文档的主要内容详细介绍的是如何使用单片机实现智能电子琴的设计资料合集免费下载
    发表于 03-12 08:00 30次下载
    使用单片机<b class='flag-5'>实现</b>智能<b class='flag-5'>电子琴</b>的设计资料合集

    基于FPGA的简易电子琴实现

    本系统是采用EDA技术设计的一个简易的八音符电子琴,该系统基于计算机中时钟分频器的原理,采用自顶向下的设计方法来实现,它可以通过按键输入来控制音响。多功能电子琴的设计是在原有普通电子琴
    发表于 04-28 11:16 45次下载

    基于STM32单片机的电子琴设计与实现

    基于STM32单片机的电子琴设计与实现
    发表于 06-27 09:25 120次下载

    电子琴的设计与实现

    电子琴
    发表于 05-31 16:48 26次下载

    基于FPGA的电子琴设计

    电子发烧友网站提供《基于FPGA的电子琴设计.pdf》资料免费下载
    发表于 10-10 09:40 11次下载
    基于FPGA的<b class='flag-5'>电子琴</b>设计

    电子琴设计资料

    电子发烧友网站提供《电子琴设计资料.pdf》资料免费下载
    发表于 10-11 10:21 2次下载
    <b class='flag-5'>电子琴</b>设计资料