1539|6

655

帖子

29

TA的资源

版主

楼主
 

49“万里”树莓派小车——PicoW学习(C语言UDP通信) [复制链接]

    UDP通信具有速度快的优点,TCP通信有例程可以参考,但是UDP通信却没有。

目标

    新建一个PicoW模块基于UDP协议、STA模式的“echo”例程工程,可以通过手机与PicoW进行通信,并通过串口打印出相关信息。

新建工程

    参考前面帖子的工程创建方法,使用“pico project generato”工具,工程名为“Test_IwIP_UDP”,勾选“Console over UART”和“Background IwIP”。

代码编写

    前面的工作已经将工程框架搭建完成,下面贴出主要的代码。

添加头文件

#include "lwip/udp.h"

添加定义与全局变量

    主要是WIFI用户名和密码,这里XX需要替换为自己的,通信端口号和pcb。

#define WIFI_SSID "XXXXXXXXXXX"
#define WIFI_PASSWORD "XXXXXXXXX"
#define  RCV_FROM_PORT 1234
struct udp_pcb  * rcv_udp_pcb;

main函数编写

    主要是芯片的初始化,连接WiFi路由器,绑定UDP,注册接收回调函数,进行LED灯闪烁。UDP没有TCP那么多的功能,例如连接成功,发送成功等,都是没有回调函数的。

int main()
{
    static bool LED_State=0;
    stdio_init_all();
    puts("Test IwIP UDP");
    if (cyw43_arch_init()) {
        printf("Wi-Fi init failed");
        return -1;
    }
    cyw43_arch_enable_sta_mode();
    printf("Connecting to Wi-Fi...\n");
    if (cyw43_arch_wifi_connect_timeout_ms(WIFI_SSID, WIFI_PASSWORD, CYW43_AUTH_WPA2_AES_PSK, 30000)) {
        printf("failed to connect.\n");
        return 1;
    } else {
        printf("Connected.\n");
    }
    rcv_udp_pcb = udp_new();
    err_t err = udp_bind(rcv_udp_pcb,IP_ADDR_ANY,RCV_FROM_PORT);
    udp_recv(rcv_udp_pcb, RcvFromUDP,NULL);
    while (true) {
         sleep_ms(100);
        if(LED_State){
            LED_State=false;
        }else{
            LED_State=true;
        }
        cyw43_arch_gpio_put(CYW43_WL_GPIO_LED_PIN, LED_State);
    }
    return 0;
}

接收回调函数和发送函数的编写

    在接收函数中将发送者的相关信息打印出来,并将收到的信息发送。UDP理论上是没法确实两者是否连接成功的,也不能像TCP一样,连接成功后可以发送一个“连接成功”的信息给Client。只有当收到信息后,才能通过收到信息,知道是谁发送了信息,进而发送回去。

void SendUDP(const ip_addr_t *dst_ip , int port, void * data, int data_size)
{
      struct pbuf * p = pbuf_alloc(PBUF_TRANSPORT,data_size+1,PBUF_RAM);
      char *pt = (char *) p->payload;
      memcpy(pt,data,data_size);
      pt[data_size]='\0';
      cyw43_arch_lwip_begin();
      udp_sendto(rcv_udp_pcb,p,dst_ip,port);
      printf("send -> %s\n", pt);
      cyw43_arch_lwip_end();
      pbuf_free(p);
}

void RcvFromUDP(void * arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t*addr,u16_t port)
{
 char *buffer=calloc(p->len+1,sizeof(char));  // use calloc to >
    strncpy(buffer,(char *)p->payload,p->len);
    printf("received from %d.%d.%d.%d port=%d\n",addr->addr&0xff,
                                              (addr->addr>>8)&0xff,
                                              (addr->addr>>16)&0xff,
                                              addr->addr>>24,port);
    printf("Length = %d , Total Length = %d\n",p->len,p->tot_len);
    printf("payload -> %s\n", buffer);
    free(buffer);
    pbuf_free(p);
    SendUDP(addr,port,buffer,p->len);
}

运行效果

    在手机上运行“lb_socket_Android”APP,这是我自己编写的UDP通信软件,在前面有介绍,最后有下载。通过上一帖的方法知道PicoW的IP地址,然后输入端口号,点击连接。编辑发送数据,点击发送,就会看到接收到相同的数据。

 

    连接串口调试助手,在串口调试助手上,会有WiFi连接整个过程的信息,例如,接收回调函数打印的相关信息。

 

APP源码与编写:socket学习(Android收发)

PicoW源码: Test_IwIP_UDP.zip (1.57 MB, 下载次数: 1)
此帖出自创意市集论坛

最新回复

感谢楼主提供的技术分享,先收藏学习再发表个人意见,顶起来   详情 回复 发表于 2023-11-21 14:13
点赞 关注(1)
个人签名QQ:252669569
 
 

回复
举报

707

帖子

0

TA的资源

纯净的硅(高级)

沙发
 

感谢分享,看到咱们两个用的串口调试助手是一样的啊

此帖出自创意市集论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

厉害厉害,学习了

此帖出自创意市集论坛
 
 
 

回复

7087

帖子

11

TA的资源

版主

4
 
版主大大,这一系列更新,这么执着,我们得向您多学习学习呀!
此帖出自创意市集论坛
 
 
 

回复

421

帖子

7

TA的资源

纯净的硅(初级)

5
 

这个模块能够完成的TCP测试,是通过UART转TCP实现的吗?

此帖出自创意市集论坛

点评

这个不是哦,这个PicoW是由一个主控芯片,加上一个双模Wifi+blue芯片,两者是通过SPI接口连接的,相比使用UART转的模块这个速度更快,更加底层,需要配置的也更多。  详情 回复 发表于 2023-11-18 21:33
 
 
 

回复

655

帖子

29

TA的资源

版主

6
 
lansebuluo 发表于 2023-11-15 08:49 这个模块能够完成的TCP测试,是通过UART转TCP实现的吗?

这个不是哦,这个PicoW是由一个主控芯片,加上一个双模Wifi+blue芯片,两者是通过SPI接口连接的,相比使用UART转的模块这个速度更快,更加底层,需要配置的也更多。

此帖出自创意市集论坛
个人签名QQ:252669569
 
 
 

回复

756

帖子

4

TA的资源

纯净的硅(高级)

7
 

感谢楼主提供的技术分享,先收藏学习再发表个人意见,顶起来

此帖出自创意市集论坛
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表