362|2

87

帖子

0

TA的资源

一粒金砂(中级)

全能小网关|CH32V208--第三篇:ETH使用 [复制链接]

本帖最后由 xiaolinen 于 2024-7-2 20:43 编辑

一:准备工作

        PC端设置以太网IP和端口,如下图所示:

1719923438370.png

二:TCP 客户端测试使用

        2.1,重点代码记录

            2.1.1,创建TCP客户端

void WCHNET_CreateTcpSocket(void)
{
    u8 i;
    SOCK_INF TmpSocketInf;

    memset((void *) &TmpSocketInf, 0, sizeof(SOCK_INF));
    memcpy((void *) TmpSocketInf.IPAddr, DESIP, 4);//设置目的IP
    TmpSocketInf.DesPort = desport;//设置目的端口
    TmpSocketInf.SourPort = srcport++;//设置源端口
    TmpSocketInf.ProtoType = PROTO_TYPE_TCP;//设置协议类型
    TmpSocketInf.RecvBufLen = RECE_BUF_LEN;//设置数据缓冲区长度
    i = WCHNET_SocketCreat(&SocketId, &TmpSocketInf);
    printf("WCHNET_SocketCreat %d\r\n", SocketId);
    mStopIfError(i);
    i = WCHNET_SocketConnect(SocketId);//建立TCP连接
    mStopIfError(i);
}

            2.1.2,套接字中断事件监控

void WCHNET_DataLoopback(u8 id)
{
    u32 len, totallen;
    u8 *p = MyBuf, TransCnt = 255;

    len = WCHNET_SocketRecvLen(id, NULL);//query length
    printf("Receive Len = %d\r\n", len);
    totallen = len;
    WCHNET_SocketRecv(id, MyBuf, &len);//Read the data of the receive buffer into MyBuf
    printf("recv buf :\r\n%s\r\n",MyBuf);
    while(1){
        len = totallen;
        WCHNET_SocketSend(id, p, &len);//Send the data
        totallen -= len;//Subtract the sent length from the total length
        p += len;//offset buffer pointer
        if( !--TransCnt )  break;//Timeout exit
        if(totallen) continue;//If the data is not sent, continue to send
        break;//After sending, exit
    }
}

void WCHNET_HandleSockInt(u8 socketid, u8 intstat)
{
    u8 i;

    if (intstat & SINT_STAT_RECV)//receive data
    {
        printf("TCP Client Recv!\r\n");
        WCHNET_DataLoopback(socketid);//Data loopback
    }
    if (intstat & SINT_STAT_CONNECT)//connect successfully
    {
#if KEEPALIVE_ENABLE
        WCHNET_SocketSetKeepLive(socketid, ENABLE);
#endif
        WCHNET_ModifyRecvBuf(socketid, (u32) SocketRecvBuf[socketid], RECE_BUF_LEN);
        for (i = 0; i < WCHNET_MAX_SOCKET_NUM; i++) {
            if (socket[i] == 0xff) {//save connected socket id
                socket[i] = socketid;
                break;
            }
        }
        printf("TCP Connect Success\r\n");
        printf("socket id: %d\r\n", socket[i]);
    }
    if (intstat & SINT_STAT_DISCONNECT)//disconnect
    {
        for (i = 0; i < WCHNET_MAX_SOCKET_NUM; i++) {//delete disconnected socket id
            if (socket[i] == socketid) {
                socket[i] = 0xff;
                break;
            }
        }
        printf("TCP Disconnect\r\n");
    }
    if (intstat & SINT_STAT_TIM_OUT)//timeout disconnect
    {
        for (i = 0; i < WCHNET_MAX_SOCKET_NUM; i++) {//delete disconnected socket id
            if (socket[i] == socketid) {
                socket[i] = 0xff;
                break;
            }
        }
        printf("TCP Timeout\r\n");
        WCHNET_CreateTcpSocket();
    }
}

        2.2,实验现象:TCP客户端接收到服务器下发的数据,打印展示,并将数据原路返回至服务器,如下图所示:

TCP.jpg
三:UDP服务器测试使用
        3.1,重点代码记录
            3.1.1,创建UDP服务器
void WCHNET_CreateUdpSocket(void)
{
    u8 i;
    SOCK_INF TmpSocketInf;

    memset((void *) &TmpSocketInf, 0, sizeof(SOCK_INF));
    TmpSocketInf.SourPort = srcport;//设置源端口
    TmpSocketInf.ProtoType = PROTO_TYPE_UDP;//设置协议类型
    TmpSocketInf.RecvStartPoint = (u32) SocketRecvBuf;//设置数据缓冲区起始地址
    TmpSocketInf.RecvBufLen = UDP_RECE_BUF_LEN;//设置数据缓冲区长度
    TmpSocketInf.AppCallBack = WCHNET_UdpServerRecv;//绑定接受回调函数
    i = WCHNET_SocketCreat(&SocketId, &TmpSocketInf);
    printf("WCHNET_SocketCreat %d\r\n", SocketId);
    mStopIfError(i);
}

            3.1.2,数据接收回调函数

void WCHNET_UdpServerRecv(struct _SOCK_INF *socinf, u32 ipaddr, u16 port, u8 *buf, u32 len)
{
    u8 ip_addr[4], i;

    printf("Remote IP:");
    for (i = 0; i < 4; i++) {
        ip_addr[i] = ipaddr & 0xff;
        printf("%d ", ip_addr[i]);
        ipaddr = ipaddr >> 8;
    }

    printf("srcport = %d len = %d socketid = %d\r\n", port, len,
            socinf->SockIndex);
    printf("buf:%s\r\n",buf);

    WCHNET_SocketUdpSendTo(socinf->SockIndex, buf, &len, ip_addr, port);
}

        3.2,实验现象:UDP服务器监听客户端,打印展示接收到的数据,并将数据原路返回至客户端,如下图所示:

UDP_S.png

 

此帖出自RF/无线论坛

最新回复

他这个,是跑了OS吗?需要跑OS吗?  详情 回复 发表于 2024-7-3 06:55

回复
举报

6646

帖子

9

TA的资源

版主

他这个,是跑了OS吗?需要跑OS吗?
此帖出自RF/无线论坛

点评

帖子里的实验过程没有跑OS的,但是这款芯片是可以跑OS的,具体怎么选择看自己的需求了。  详情 回复 发表于 2024-7-3 09:26

回复

87

帖子

0

TA的资源

一粒金砂(中级)

lugl4313820 发表于 2024-7-3 06:55 他这个,是跑了OS吗?需要跑OS吗?

帖子里的实验过程没有跑OS的,但是这款芯片是可以跑OS的,具体怎么选择看自己的需求了。

此帖出自RF/无线论坛

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
推荐帖子
定时计数器T0作定时应用技术(一)

1. 实验任务 用AT89S51单片机的定时/计数器T0产生一秒的定时时间,作为秒计数时间,当一秒产生时,秒计数加1,秒计数到60时, ...

6年LED灯珠生产技术工程师经验(LED生产过程漏电的原因分析供工程师讨论)原创

一 选好芯片芯片的抗静电能力要好一点。 二 主要是双线双电极会漏点也就是说白光蓝光和绿光,红的黄的单电极的不怎么会漏电 ...

找喜欢流明的ARM芯片的人,和我一起做ARM项目的设计

1. 有没有人愿意参与到我的打印机ARM项目中来。参与本项目可以获得以下提高: 1。 熟悉TI LM3S9B90 ARM 的硬件和软件 设计, ...

[DIY]再造二十四小时的感动【古典版II】 自制QS18-12辉光电子钟 附百图

前几天刚刚完成QS30-1管的辉光钟,有不少朋友在向我讨教如何制作。说实话,就个人而言,我更喜欢QS18-12辉光管。 QS30-1的辉光 ...

再上一辑,FPGA示波器!双通200M+200M采样,模拟带宽25M,开源,正学习FPGA网友细看了。

俯身苦干几个月,软硬件终于调试差不多了!出关,给大家看个鲜。 感谢坛中avic及各位高手的贴子,从中学习了很多!!! 性能目标 ...

上海某知名MCU外企需求自动化测试开发工程师

代朋友转发:自动化测试高级工程师 岗位职责: 负责开发自动化测试工具软件用于测试嵌入式系统 负责产品:MCU芯片 岗位要求: ...

TWS真无线耳机充电仓专用开关充电芯片BQ25618/9详解

BQ25618/9是TI为TWS耳机充电仓专门开发的一款三合一(保护,充电及升压)的IIC控制开关充电芯片。 其中BQ25618跟BQ25619在规 ...

GD32L233C-START 开发板 学习笔记(三)

GD32L233C-START 开发板学习笔记(三) 一、GD32L23C-START 开发板 简介: GD32L233C-START 开发板上自带程序调试工具 ...

射频与微波晶体管放大器基础

《射频与微波晶体管放大器基础》 全面讲解了射频与微波晶体管放大器的各种类型,包括低噪声、窄带、宽带、线性、高功率、高效率 ...

【行空板 Python编程学习主控板】显示屏图形界面基础使用

行空板可以使用图形界面编程软件Mind+编程,界面如下: 653856 这对于初学者,非常友好。即使是基础很少的中小学生, ...

快速回复 返回顶部 返回列表