本帖最后由 南来之风 于 2025-11-11 22:51 编辑
结合官方文档TCP-SERVER,本文体验在MPLAB X IDE 6.25版本中体验TCP的使用。
基于MHC图形化配置,可以在Content Manager中添加Wi-Fi相关的组件
然后添加WI-FI service,软件会自动添加相关联的大概20多个子模块。一直点击OK即可。
可以通过下拉选择不同的层级。点击不同的组件,可以在右侧配置详细信息:
电脑连接开发板的接入点:
使用Putty连接到TCP Server:
发送GREEN_TOGGLE,绿色LED灯颜色翻转。
发送RED_TOGGLE,红色LED灯颜色翻转。
也可以使用Python脚本作为一个TCP Client与开发板TCP Server进行通信。
- import socket
- import time
- def auto_tcp_client(server_ip, port=5555):
- """自动发送数据的TCP客户端"""
- try:
- # 创建并连接socket
- client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- client_socket.connect((server_ip, port))
- print(f"已连接到 {server_ip}:{port}")
-
- # 自动发送测试数据
- messages = [
- "Hello Server!",
- "GREEN_TOGGLE",
- "This is a test message",
- "TCP Client is working",
- "RED_TOGGLE",
- "Goodbye!"
- ]
-
- for message in messages:
- client_socket.sendall(message.encode('utf-8'))
- print(f"已发送: {message}")
- time.sleep(1) # 等待1秒
-
- except Exception as e:
- print(f"错误: {e}")
- finally:
- client_socket.close()
- print("连接已关闭")
- # 使用示例
- if __name__ == "__main__":
- import sys
- if len(sys.argv) != 2:
- print("请提供服务器IP地址")
- sys.exit(1)
-
- auto_tcp_client(sys.argv[1])
TCP服务器端主要的代码有初始化:
- void APP_Initialize(void) {
- SYS_CONSOLE_MESSAGE("APP_Initialize\n");
- g_tcpServCfg.mode = SYS_NET_INDEX0_MODE;
- g_tcpServCfg.port = SYS_NET_INDEX0_PORT;
- g_tcpServCfg.enable_tls = SYS_NET_INDEX0_ENABLE_TLS;
- g_tcpServCfg.ip_prot = SYS_NET_INDEX0_IPPROT;
- g_tcpServCfg.enable_reconnect = SYS_NET_INDEX0_RECONNECT;
- g_tcpServHandle = SYS_NET_Open(&g_tcpServCfg, TcpServCallback, 0);
- if (g_tcpServHandle != SYS_MODULE_OBJ_INVALID)
- SYS_CONSOLE_PRINT("TCP Service Initialized Successfully\r\n");
- }
还有服务器的回调:
- void TcpServCallback(uint32_t event, void *data, void* cookie) {
- switch (event) {
- case SYS_NET_EVNT_CONNECTED:
- {
- SYS_CONSOLE_PRINT("TcpServCallback(): Status UP\r\n");
- while (SYS_NET_SendMsg(g_tcpServHandle, (uint8_t*) "hello", 5) <= 0);
- break;
- }
- case SYS_NET_EVNT_DISCONNECTED:
- {
- SYS_CONSOLE_PRINT("TcpServCallback(): Status DOWN\r\n");
- break;
- }
- case SYS_NET_EVNT_RCVD_DATA:
- {
- int32_t cumm_len = 0;
- int32_t len = RECV_BUFFER_LEN;
- while (len == RECV_BUFFER_LEN) {
- len = SYS_NET_RecvMsg(g_tcpServHandle, recv_buffer, RECV_BUFFER_LEN);
- if (len > 0) {
- if (cumm_len == 0) {
- char buffer[33];
- int32_t tmp_len = (len > 32) ? 32 : len;
- memcpy(buffer, recv_buffer, tmp_len);
- buffer[tmp_len] = '\0';
- SYS_CONSOLE_PRINT("TcpServCallback(): Data Rcvd = %s\r\n", buffer);
- if (strstr(buffer, "GREEN_TOGGLE") != NULL) {
- GPIO_RK3_GREEN_Toggle();
- }
- if (strstr(buffer, "RED_TOGGLE") != NULL) {
- GPIO_RK1_RED_Toggle();
- }
- }
- cumm_len += len;
- SYS_NET_SendMsg(g_tcpServHandle, recv_buffer, len);
- }
- }
- SYS_CONSOLE_PRINT("TcpServCallback(): Total Data Rcvd = %d Bytes\r\n", cumm_len);
- break;
- }
- case SYS_NET_EVNT_LL_INTF_DOWN:
- {
- /*
- ** User needs to take a decision if they want to close the socket or
- ** wait for the Lower layer to come up
- */
- SYS_CONSOLE_PRINT("TcpServCallback(): Lower Layer Down\r\n");
- break;
- }
- case SYS_NET_EVNT_LL_INTF_UP:
- {
- /*
- ** The lower layer was down and now it has come up again.
- ** The socket was in connected state all this while
- */
- SYS_CONSOLE_PRINT("TcpServCallback(): Lower Layer Up\r\n");
- break;
- }
- case SYS_NET_EVNT_SERVER_AWAITING_CONNECTION:
- {
- /*
- ** The server is awaiting connection from the client
- */
- SYS_CONSOLE_PRINT("TcpServCallback(): Server Awaiting Connection\r\n");
- break;
- }
- }
- }
总结:
借助于Microchip丰富的资源与开发文档,可以快速的找到可借鉴的方案。借助于MPLABX ide可以图形化配置,自动代码生成,也节约了大量的时间。
虽然MPLABX ide有一点不太容易上手,熟悉后就发现是开发的一大利器。
|