树莓派网口测试
墨初 知识笔记 74阅读
C的USB口主要用于烧录程序也可以虚拟出串口使用通过TTL串口转USB连接UART0 的默认引脚 RP2040 GPIO 0UART0 TX <----> USB_TTL_RXRP2040 GPIO 1UART0 RX <----> USB_TTL_TX 使用模块连接RP2040进行连线时 RP2040 GPIO 16 <----> W5100S MISORP2040 GPIO 17 <----> W5100S CSRP2040 GPIO 18 <----> W5100S SCKRP2040 GPIO 19 <----> W5100S MOSIRP2040 GPIO 20 <----> W5100S RST 通过网线直接连接PC网口或PC和设备都通过网线连接交换机或路由器LAN口 4.4 相关代码
我们直接打开tcp_server.c文件路径examples/tcp_server/tcp_server.c看下具体实现

可以看到这里是以dhcp模式配置网络信息的因此在主控和W5100S初始化完成后会进行DHCP初始化然后增加一个定时器初始化用来做dhcp过程中的计时以进行超时处理接着进入dhcp配置网络信息成功则直接进入循环调用回环测试函数失败则用我们初始化的静态I网络信息进行配置然后再进入循环调用回环测试函数如下所示
/* Network information to be configured. */wiz_NetInfo net_info { .mac {0x00, 0x08, 0xdc, 0x1e, 0xed, 0x2e}, // Configured MAC address .ip {192, 168, 1, 10}, // Configured IP address .sn {255, 255, 255, 0}, // Configured subnet mask .gw {192, 168, 1, 1}, // Configured gateway .dns {8, 8, 8, 8}, // Configured domain address .dhcp NETINFO_DHCP}; // Configured dhcp model,NETINFO_DHCP:use dhcp; NETINFO_STATIC: use static ip.wiz_NetInfo get_info;static uint8_t ethernet_buf[ETHERNET_BUF_MAX_SIZE] { 0,}; // Send and receive cachestatic uint16_t local_port 8000; // Local portstatic uint8_t dhcp_get_ip_flag 0; // Define the DHCP acquisition flagint main(){ struct repeating_timer timer; // Define the timer structure /* MCU init */ stdio_init_all(); // Initialize the main control peripheral wizchip_initialize(); // Initialize the chip interface /*dhcp init*/ DHCP_init(SOCKET_ID, ethernet_buf); // DHCP initialization add_repeating_timer_ms(1000, repeating_timer_callback, NULL, &timer); // Add DHCP 1s Tick Timer handler printf(wiznet chip tcp server example.\r\n); network_init(&net_info); // Configuring Network Information print_network_information(&get_info); // Read back the configuration information and print it while (true) { loopback_tcps(SOCKET_ID, ethernet_buf, local_port); // tcp server data loop test }}
跳进回环测试里面看下其具体实现 该函数有这几个参数socket端口号、数据收发缓存、目标IP地址、目标端口可根据需要自行填入参数。其整体通过一个Swatch状态机轮询socket状态根据不同进行相应的处理依次完成了初始化、打开端口、连接服务器、收到数据后回传的操作 其中本地端口直接在函数内初始化了。如下所示

/** * brief tcp server loopback test * param sn: socket number * param buf: Data sending and receiving cache * param port: Listen port * return value for SOCK_ERRORs,return 1:no error */int32_t loopback_tcps(uint8_t sn, uint8_t* buf, uint16_t port){ int32_t ret; uint16_t size 0, sentsize0;#ifdef _LOOPBACK_DEBUG_ uint8_t destip[4]; uint16_t destport;#endif switch(getSn_SR(sn)) { case SOCK_ESTABLISHED : if(getSn_IR(sn) & Sn_IR_CON) {#ifdef _LOOPBACK_DEBUG_getSn_DIPR(sn, destip);destport getSn_DPORT(sn);printf(%d:Connected - %d.%d.%d.%d : %d\r\n,sn, destip[0], destip[1], destip[2], destip[3], destport);#endifsetSn_IR(sn,Sn_IR_CON); } if((size getSn_RX_RSR(sn)) > 0) // Dont need to check SOCKERR_BUSY because it doesnt not occur. {if(size > DATA_BUF_SIZE) size DATA_BUF_SIZE;ret recv(sn, buf, size); buf[ret]0x00; printf(recv: %s\n,buf); //print the receive data.if(ret < 0) return ret; // check SOCKERR_BUSY & SOCKERR_XXX. For showing the occurrence of SOCKERR_BUSY.size (uint16_t) ret;sentsize 0;while(size ! sentsize){ret send(sn, bufsentsize, size-sentsize);if(ret < 0){close(sn);return ret;}sentsize ret; // Dont care SOCKERR_BUSY, because it is zero.} } break; case SOCK_CLOSE_WAIT :#ifdef _LOOPBACK_DEBUG_ //printf(%d:CloseWait\r\n,sn);#endif if((ret disconnect(sn)) ! SOCK_OK) return ret;#ifdef _LOOPBACK_DEBUG_ printf(%d:Socket Closed\r\n, sn);#endif break; case SOCK_INIT :#ifdef _LOOPBACK_DEBUG_ printf(%d:Listen, TCP server loopback, port [%d]\r\n, sn, port);#endif if( (ret listen(sn)) ! SOCK_OK) return ret; break; case SOCK_CLOSED:#ifdef _LOOPBACK_DEBUG_ //printf(%d:TCP server loopback start\r\n,sn);#endif if((ret socket(sn, Sn_MR_TCP, port, 0x00)) ! sn) return ret;#ifdef _LOOPBACK_DEBUG_ //printf(%d:Socket opened\r\n,sn);#endif break; default: break; } return 1;}
4.5 测试现象 硬件连接无误后编译烧录程序具体可参考第一章节选择对应的COM口打开WIZ UartTool填入参数波特率1152008位数据位1位停止位无校验位无流控填完参数后点击open打开观察串口打印的信息以获取设备运行状态打开SocketTester在左列填入相对应的参数TCP client模式根据串口打印的信息填入IP和端口完成后点击Connect连接连接成功后发送数据观察现象可以看到数据成功发送并成功回传如下图所示
5. 注意事项 不要混淆服务器IP和客户端IP。连接后交互过程不要突然断开网线造成假链接。如果想用WIZnet的W5500来实现本章的示例我们只需修改两个地方即可 在library/ioLibrary_Driver/Ethernet/下找到wizchip_conf.h这个头文件将_WIZCHIP_ 宏定义修改为W5500。在library下找到CMakeLists.txt文件将COMPILE_SEL设置为ON即可OFF为W5100SON为W5500。 6. 相关链接WIZnet官网
WIZnet官方库链接
本章例程链接
想了解更多评论留言哦
标签: