3263|3

1942

帖子

3

TA的资源

版主

楼主
 

【BearPi-HM Nano,玩转鸿蒙“碰一碰”】Part4:OLED与UDP的结合! [复制链接]

1.介绍

上一篇我们写了OLED的驱动,也说好了这一篇写UDP与电脑通信,然后显示从电脑下发过来的信息,其实比较容易的,因为有LiteOS,采用消息队列让两个线程之间进行通信,将UDP收到的数据发送给OLED的线程,然后显示出来就可以了。

2.设计

首先开启UDP的例程【D3_iot_udp_client】,在这个例程上添加一个发送消息的机制就可以了,消息在OLED中创建,这里只需要引入即可,然后在接收到数据的时候发送就可以了。

typedef struct
{
  //object data type
  char *Buf;
  
  uint8_t Idx;
} MSGQUEUE_OBJ_t;

MSGQUEUE_OBJ_t msg;

//message queue id
extern osMessageQueueId_t mid_MsgQueue; 

//总计发送 count 次数据
    while (1)
    {
        bzero(recvBuf, sizeof(recvBuf));

        //发送数据到服务远端
        sendto(sock_fd, send_data, strlen(send_data), 0, (struct sockaddr *)&send_addr, addr_length);

        //线程休眠一段时间
        sleep(10);

        //接收服务端返回的字符串
        recvfrom(sock_fd, recvBuf, sizeof(recvBuf), 0, (struct sockaddr *)&send_addr, &addr_length);
        printf("%s:%d=>%s\n", inet_ntoa(send_addr.sin_addr), ntohs(send_addr.sin_port), recvBuf);
        //给消息队列赋值
        memset(message_buf, 0, sizeof(message_buf));
        memcpy(message_buf, recvBuf, strlen(recvBuf));
        msg.Buf = message_buf;
        msg.Idx = 0U;
        osMessageQueuePut(mid_MsgQueue, &msg, 0U, 0U);
    }

这里重新创建了一个数组,测试的时候直接用【recvBuf】是传出一个空数组,所以额外添加了一个数组【message_buf】,这里算是一个坑。

然后再开始编写OLED部分,由于OLED部分接口基本都有了,只要直接调用一下就可以了。

typedef struct
{
  //object data type
  char *Buf;
  uint8_t Idx;
} MSGQUEUE_OBJ_t;

MSGQUEUE_OBJ_t msg1;

osMessageQueueId_t mid_MsgQueue; 

    //创建消息
    mid_MsgQueue = osMessageQueueNew(MSGQUEUE_OBJECTS, 100, NULL);
    if (mid_MsgQueue == NULL)
    {
        printf("Falied to create Message Queue!\n");
    }

    //task cycle
    while(1)
    {
        //wait message queue
        //printf("wait...\n");
        usleep(1000000);

        status = osMessageQueueGet(mid_MsgQueue, &msg1, NULL, 0U);
        if (status == osOK)
        {
            printf("rec:%s\n", msg1.Buf);
            OLED_ShowString(0, 4, (uint8_t *)msg1.Buf, 16);
        }
    }

这里只把主要代码帖出来,最后会把源码分享出来,大家有兴趣的去下载就好了。这里呢,就是一直接收消息队列,等待就可以了,为什么需要【sleep(1000000)】主要是我遇到一个BUG,没有这个sleep的话,UDP似乎是不工作的。把他加上就正常了,具体原因没有去找,有兴趣的童鞋可以去找一下,我这边就不去找原因了。

最后下载到板子上,然后打开【TCP/UDP Socket 调试助手】,选择【UDP Server】设置端口号为【8888】。

图1

按下开发板的复位键,串口打印如下内容。

图2

等到调试助手收到下面这条指令,说明UDP连接成功,并发送了一条消息。

图3

最后测试一下,发送【123456】和【wangerxiao】显示接收正常。

图4

OLED显示最后一次接收到的内容。

图5

3.总结

那么这次的Demo就到这了,后续要是还有时间测评小熊派的话会继续给大家分享好玩的东西,公司可能也要引入【HarmonyOS】系统做项目,到时候也会分享一些HarmonyOS的经验的!

源码分享: udp_oled.zip (16.75 KB, 下载次数: 12)

最后晒一下粘人的小妖精,陪伴写测评的我~

 

 

此帖出自ARM技术论坛

最新回复

很详细,能撸猫的都是有女朋友的。   详情 回复 发表于 2021-6-15 17:28
点赞 关注
 

回复
举报

6802

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

看来,小熊派还是挺好玩的

已经下载了楼主的源码了

 

此帖出自ARM技术论坛

点评

主要产家封装的好,添加功能方便  详情 回复 发表于 2021-6-13 12:36
 
 
 

回复

1942

帖子

3

TA的资源

版主

板凳
 
Jacktang 发表于 2021-6-13 11:47 看来,小熊派还是挺好玩的 已经下载了楼主的源码了  

主要产家封装的好,添加功能方便

此帖出自ARM技术论坛
 
 
 

回复

7608

帖子

2

TA的资源

五彩晶圆(高级)

4
 

很详细,能撸猫的都是有女朋友的。

此帖出自ARM技术论坛
 
个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表