w494143467 发表于 2021-6-11 21:38

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

<p><strong>1.介绍</strong></p>

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

<p><strong>2.设计</strong></p>

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

<pre>
<code>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 *)&amp;send_addr, addr_length);

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

      //接收服务端返回的字符串
      recvfrom(sock_fd, recvBuf, sizeof(recvBuf), 0, (struct sockaddr *)&amp;send_addr, &amp;addr_length);
      printf("%s:%d=&gt;%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, &amp;msg, 0U, 0U);
    }</code></pre>

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

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

<pre>
<code>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, &amp;msg1, NULL, 0U);
      if (status == osOK)
      {
            printf("rec:%s\n", msg1.Buf);
            OLED_ShowString(0, 4, (uint8_t *)msg1.Buf, 16);
      }
    }</code></pre>

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

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

<p class="imagemiddle" style="text-align: center;"></p>

<p style="text-align: center;">图1</p>

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

<p class="imagemiddle" style="text-align: center;"></p>

<p style="text-align: center;">图2</p>

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

<p class="imagemiddle" style="text-align: center;"></p>

<p style="text-align: center;">图3</p>

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

<p class="imagemiddle" style="text-align: center;"></p>

<p style="text-align: center;">图4</p>

<p>OLED显示最后一次接收到的内容。</p>

<p class="imagemiddle" style="text-align: center;"></p>

<p style="text-align: center;">图5</p>

<p><strong>3.总结</strong></p>

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

<p>源码分享:</p>

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

<p class="imagemiddle" style="text-align: center;"></p>

<p>&nbsp;</p>

<p>&nbsp;</p>

Jacktang 发表于 2021-6-13 11:47

<p>看来,小熊派还是挺好玩的</p>

<p>已经下载了楼主的源码了</p>

<p>&nbsp;</p>

w494143467 发表于 2021-6-13 12:36

Jacktang 发表于 2021-6-13 11:47
看来,小熊派还是挺好玩的

已经下载了楼主的源码了

&nbsp;

<p>主要产家封装的好,添加功能方便</p>

freebsder 发表于 2021-6-15 17:28

<p>很详细,能撸猫的都是有女朋友的。</p>
页: [1]
查看完整版本: 【BearPi-HM Nano,玩转鸿蒙“碰一碰”】Part4:OLED与UDP的结合!